Cześć,
próbuję odizolować Chromium od systemu głównego w Arch Linuksie. Użyłem do tego:
unshare(CLONE_NEWNS|CLONE_NEWCGROUP|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID);
mount("none", "/", NULL, MS_PRIVATE|MS_REC, NULL);
chroot("/path/to/new/root");
chdir("/");
mount("proc", "/proc", "proc", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL);
setresuid(-1, 1001, 1001);
Program ma ustawiony bit setuid. Chromium uruchamia się i nie zauważyłem żadnych problemów. Te pojawiają się jednak gdy próbuję dodać do programu przestrzeń nazw sieciowych za pomocą:
int namespace_fd = open("/var/run/netns/chromium_netns", O_RDONLY|O_CLOEXEC);
setns(namespace_fd, CLONE_NEWNET)
Curl działa, ale przy próbie uruchomienia Chromium pojawiają się błędy:
[3:3:0721/210403.008132:ERROR:ozone_platform_x11.cc(239)] Missing X server or $DISPLAY
[3:3:0721/210403.008334:ERROR:env.cc(255)] The platform failed to initialize. Exiting.
strace:
connect(29, {sa_family=AF_UNIX, sun_path=@"/tmp/.X11-unix/X0"}, 20) = -1 ECONNREFUSED (Połączenie odrzucone)
connect(29, {sa_family=AF_INET6, sin6_port=htons(6000), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_scope_id=0}, 28) = -1 ECONNREFUSED (Połączenie odrzucone)
connect(29, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Połączenie odrzucone)
Przy ustawianiu przestrzeni nazw sieciowych skorzystałem z tego (https://dug.net.pl/tekst/262/uruchamianie_firefoksa_w_osobnej_przestrzeni_nazw_zasobow_sieciowych_(osobna_kopia_stosu_sieciowego)_i_przekierowanie_calego_ruchu_poprzez_siec_tor/h/gniazdo%20sieciowe) tutoriala (do punktu czwartego - ostatnie polecenie to "sudo iptables -A FORWARD -i veth0 -o eth0 -j ACCEPT"). Link (https://pastebin.com/xM3CbtWr) do kodu programu. Proszę o pomoc:)
Dzięki za odpowiedź. Używam ciągle zasłużonego iptables ;) Nazwę interfejsu zmieniłem wcześniej. Polecenie "ip a" w chroocie pokazuje:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: veth1@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether c6:6e:c5:db:81:ab brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.1/24 scope global veth1
valid_lft forever preferred_lft forever
inet6 fe80::c46e:c5ff:fedb:81ab/64 scope link
valid_lft forever preferred_lft forever
a "ifconfig"
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::c46e:c5ff:fedb:81ab prefixlen 64 scopeid 0x20<link>
ether c6:6e:c5:db:81:ab txqueuelen 1000 (Ethernet)
RX packets 12 bytes 936 (936.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1006 (1006.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Zresztą curl łączy się z internetem. Jeśli chodzi o Chromium, to problem jest z z samym chrootem, bo jeśli usunę:
mount("none", "/", NULL, MS_PRIVATE|MS_REC, NULL);
chroot("/path/to/new/root/");
chdir("/");
mount("proc", "/proc", "proc", MS_NOSUID|MS_NODEV|MS_NOEXEC, NULL);
czyli kod który odpowiada za tworzenie chroota, to ciągle jestem w przestrzeni nazw sieciowych "chromium_netns" ("ip a" zwraca to samo co w chroocie), a Chromium uruchamia się i łączy się z internetem.
Do tej pory by połączyć się z Xsem używałem:
xauth add "$DISPLAY" MIT-MAGIC-COOKIE-1 <hex key>
i jeśli usunę:
int namespace_fd = open("/var/run/netns/chromium_netns", O_RDONLY|O_CLOEXEC);
setns(namespace_fd, CLONE_NEWNET);
to Chromium uruchamia się i łączy się z Xsem poprzez "/tmp/.X11-unix/X0". Log strace:
connect(25, {sa_family=AF_UNIX, sun_path=@"/tmp/.X11-unix/X0"}, 20) = 0
Nie rozumiem tylko dlaczego połączenie z Xsem poprzez MIT-MAGIC-COOKIE-1 nie działa w nowej przestrzeni nazw sieciowych. Proszę o pomoc
Edit:
Próbuję połączyć się przez localhosta - ustawiłem w pliku xserverrc:
exec /usr/bin/X -listen tcp "$@"
"nmap 127.0.0.1 -p-" pokazuje:
a strace:
connect(3, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(50425), sin_addr=inet_addr("127.0.0.1")}, [28 => 16]) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Połączenie odrzucone)
dodatkowo "nc -v 127.0.0.1 6000" w systemie głównym:
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!
w odizolowanym środowisku:
nc: connect to 127.0.0.1 port 6000 (tcp) failed: Connection refused
i ciągle nie mogę uruchomić Chromium