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

[0] Indeks wiadomości

Idź do wersji pełnej