Forum: PC Hard- und Software Docker, Firejail, für online-Coding absichern


von Karsten (Gast)


Lesenswert?

Hallo,
ich wollte mal fragen, ob jemand die Software-Architektur hinter Seiten 
wie https://repl.it/languages/ kennt, wo man online jeden gewünschten 
Python- C- bash- oder sonstigen Code ausführen kann.

Ich nehme an, dass für jeden Benutzer ein eigener Container (z.B. 
Docker) gestartet wird, in dem zusätzlich eine Sandbox (z.B. mit 
firejail oder chroot) errichtet wird. Nun sind genügend Exploits im 
Umlauf, wie man jede dieser Sicherheitsebenen verlassen kann.

Wäre jede der Ebenen zum jetzigen Zeitpunkt sicher, könnte man die 
Überlagerung einer Sandbox und eines Containers vielleicht als 
ausreichend ansehen, da das System nur beim gleichzeitigen 
Bekanntwerden eines Exploits für jede Ebene gefährdet wäre.

Da jedoch keine der Ebenen sicher ist, wächst der Aufwand zum Ausbrechen 
nur linear mit der Anzahl der Sicherheitsebenen. Man wendet einfach 
nacheinander Exploit1, Exploit2, ... ExploitN an, bis man nach ca. N 
Minuten Zugang zum Hostsystem hat.

Wie kommt es, dass repl.it & Co ihre Seiten unbehelligt der Hackerwelt 
zugänglich machen können, ohne dass sie von den Usern übernommen werden? 
Das Angebot "Kompiliere jeden C-Code, den du möchtest und lasse ihn auf 
unserem Server laufen so lange du möchtest" ist doch die größte 
Sicherheitslücke, die man sich vorstellen kann?

MfG
Karsten

von DPA (Gast)


Lesenswert?

Karsten schrieb:
> Wie kommt es, dass repl.it & Co ihre Seiten unbehelligt der Hackerwelt
> zugänglich machen können, ohne dass sie von den Usern übernommen werden?

Naja, das passiert sicher immer mal wieder. Die seiten die ich früher 
nutzte sind mittlerweile alle weg.

> Das Angebot "Kompiliere jeden C-Code, den du möchtest und lasse ihn auf
> unserem Server laufen so lange du möchtest" ist doch die größte
> Sicherheitslücke, die man sich vorstellen kann?

Jup, das schwierigste ist aus dem Container auszubrechen. Ich würde dem 
zwar auch nicht trauen, aber so extrem simpel ist es auch wieder nicht.

Karsten schrieb:
> Hallo,
> ich wollte mal fragen, ob jemand die Software-Architektur hinter Seiten
> wie https://repl.it/languages/ kennt, wo man online jeden gewünschten
> Python- C- bash- oder sonstigen Code ausführen kann.

Keine ahnung, aber man kann mit bash ja mal nachsehen:
https://repl.it/repls/ExpensiveSentimentalSite

Vermutlich ein x86-64 Linux system:
1
runner@13255558d281:~$ uname -a
2
Linux 13255558d281 4.13.0-1011-gcp #15-Ubuntu SMP Mon Feb 12 16:29:04 UTC 2018 x86_64 x86_64x86_64 GNU/Linux

/etc/fstab ist leer, vermutlich ein container.

Als init system wurde tini verwendet, welches dann /bin/init startet. 
Nicht sicher was /bin/init ist, file meint es könnte SYSV sein, ist 
vermutlich aber was anderes:
1
runner@13255558d281:~$ realpath /proc/1/exe
2
/dev/init
3
runner@13255558d281:~$ tr '\0' '\n' /proc/1/cmdline
4
tr: extra operand '/proc/1/cmdline'
5
Try 'tr --help' for more information.
6
runner@13255558d281:~$ tr '\0' '\n' </proc/1/cmdline
7
/dev/init
8
--
9
/bin/init
10
runner@13255558d281:~$ tr '\0' '\n' </etc/environment
11
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
12
runner@13255558d281:~$ /dev/init  -h
13
init (tini version 0.18.0 - git.fec3683)
14
Usage: init [OPTIONS] PROGRAM -- [ARGS] | --version
15
runner@13255558d281:~$ file /bin/init
16
/bin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
17
runner@13255558d281:~$ ls /proc/1/fd
18
0  1  2

tini scheint für docker gedacht zu sein, also vermutlich wird docker 
verwendet. /dev/init ist leider ro gemountet. Standard input, output und 
error worden nicht geschlossen, sind aber leider pipes, darüber kommen 
wir nicht aus dem mountns raus. Mount bestätigt die verwendung von 
docker, und das fs wird mit altmodischen linux overlay dateisystemen 
bereitgestellt, nud nicht mit aufs oder btrfs oder sowas.

Der client verwendet kein Systemd, aber /sys/fs/cgroup/systemd/ enthält 
es, gemountet durch den host. Hostsystem verwendet Systemd.

Internetverbindung mit wget geht. Könnte eventuell nen netten Proxy 
abgeben.

Mehr finde ich auf die schnelle nicht über Container und Hostsystem 
raus.


Wenn ich sowas machen müsste, würde ich versuchen clang nach WebAssembly 
zu kompilieren. Ist aber im moment leider höllisch schwer, das zum 
laufen zu kriegen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.