Programowanie > C/C++
Przestrzeń nazw sieciowych w połączeniu z chootem - Chromium nie uruchamia się
(1/1)
andrewdre:
Cześć,
próbuję odizolować Chromium od systemu głównego w Arch Linuksie. Użyłem do tego:
--- Kod: ---
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);
--- Koniec kodu ---
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ą:
--- Kod: ---
int namespace_fd = open("/var/run/netns/chromium_netns", O_RDONLY|O_CLOEXEC);
setns(namespace_fd, CLONE_NEWNET)
--- Koniec kodu ---
Curl działa, ale przy próbie uruchomienia Chromium pojawiają się błędy:
--- Kod: ---
[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.
--- Koniec kodu ---
strace:
--- Kod: ---
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)
--- Koniec kodu ---
Przy ustawianiu przestrzeni nazw sieciowych skorzystałem z tego tutoriala (do punktu czwartego - ostatnie polecenie to "sudo iptables -A FORWARD -i veth0 -o eth0 -j ACCEPT"). Link do kodu programu. Proszę o pomoc:)
1709:
Ja bym po prostu użył aplikacji Firejail, ale szanuję że ktoś chce ręcznie spróbować,
bo żeby udoskonalać to trzeba wiedzieć jak można coś ulepszyć.
Osobiście o przestrzeniach chętnie poczytam, ponieważ interesuje mnie temat piaskownicy.
Tylko chciałem zwrócić uwagę że poradnik może być już trochę nieaktualny.
Np.
- Nie wiem czy używasz zapory iptables, czy nowszego nftables
- Nazwy mogły się zmienić eth --> enp
Żeby sprawdzić zwykle używam komendy
--- Kod: ---
ifconfig
--- Koniec kodu ---
oraz
--- Kod: ---
ip a
--- Koniec kodu ---
Wiedza z internetu oraz znajomość angielskiego trochę Cię uratuje co to mówi ( w tym wiki )
https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-understanding_the_predictable_network_interface_device_names
andrewdre:
Dzięki za odpowiedź. Używam ciągle zasłużonego iptables ;) Nazwę interfejsu zmieniłem wcześniej. Polecenie "ip a" w chroocie pokazuje:
--- Kod: ---
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
--- Koniec kodu ---
a "ifconfig"
--- Kod: ---
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
--- Koniec kodu ---
Zresztą curl łączy się z internetem. Jeśli chodzi o Chromium, to problem jest z z samym chrootem, bo jeśli usunę:
--- Kod: ---
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);
--- Koniec kodu ---
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.
Paweł Kraszewski:
Te dwa błędy od Chromium wynikają ze sposobu działania Xów. Twój ekran (w skrócie driver karty graficznej/klawiatury/myszy) to serwer. Chrome (albo każda inna aplikacja chcąca się wyświetlić) to klient. X-y mają dwie formy łączności: przez gniazdo Unix (nieudane połączenie do /tmp/.X11-unix/X0), potem przez sieć (nieudane połączenie do localhost:6000).
Musisz do namespace'a dostarczyć któryś z tych dwóch sposobów.
andrewdre:
Do tej pory by połączyć się z Xsem używałem:
--- Kod: ---
xauth add "$DISPLAY" MIT-MAGIC-COOKIE-1 <hex key>
--- Koniec kodu ---
i jeśli usunę:
--- Kod: ---
int namespace_fd = open("/var/run/netns/chromium_netns", O_RDONLY|O_CLOEXEC);
setns(namespace_fd, CLONE_NEWNET);
--- Koniec kodu ---
to Chromium uruchamia się i łączy się z Xsem poprzez "/tmp/.X11-unix/X0". Log strace:
--- Kod: ---
connect(25, {sa_family=AF_UNIX, sun_path=@"/tmp/.X11-unix/X0"}, 20) = 0
--- Koniec kodu ---
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:
--- Kod: ---
exec /usr/bin/X -listen tcp "$@"
--- Koniec kodu ---
"nmap 127.0.0.1 -p-" pokazuje:
--- Kod: ---
6000/tcp open X11
--- Koniec kodu ---
a strace:
--- Kod: ---
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)
--- Koniec kodu ---
dodatkowo "nc -v 127.0.0.1 6000" w systemie głównym:
--- Kod: ---
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!
--- Koniec kodu ---
w odizolowanym środowisku:
--- Kod: ---
nc: connect to 127.0.0.1 port 6000 (tcp) failed: Connection refused
--- Koniec kodu ---
i ciągle nie mogę uruchomić Chromium
Nawigacja
Idź do wersji pełnej