Nowe posty

Autor Wątek: Przestrzeń nazw sieciowych w połączeniu z chootem - Chromium nie uruchamia się  (Przeczytany 745 razy)

Offline andrewdre

  • Nowy na forum
  • *
  • Wiadomości: 3
    • Zobacz profil
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 tutoriala (do punktu czwartego - ostatnie polecenie to "sudo iptables -A FORWARD -i veth0 -o eth0 -j ACCEPT"). Link do kodu programu. Proszę o pomoc:)

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2765
  • 1709
    • Zobacz profil
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
ifconfig

oraz
ip a
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
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline andrewdre

  • Nowy na forum
  • *
  • Wiadomości: 3
    • Zobacz profil
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.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3059
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
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.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline andrewdre

  • Nowy na forum
  • *
  • Wiadomości: 3
    • Zobacz profil
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:
6000/tcp  open  X11
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
« Ostatnia zmiana: 2023-07-28, 23:44:49 wysłana przez andrewdre »