Ich versuche, eine chroot zu schaffen, ein Programm auszuführen, das Internet-Zugang benötigt selbst eine Sandbox, unveränderlich Entwicklungsumgebung aufzubauen. Bis jetzt funktioniert mein Gefängnis gut: Ich kann Bash darin laufen lassen und einfache Programme von dort laufen lassen! DNS-Auflösung jedoch nicht funktionieren:Wie kann ich DNS-Auflösung in einem Mac OS X `chroot` auf El Capitan erhalten?
bash-3.2$ curl google.ca
curl: (6) Could not resolve host: google.ca
ich fast sicher bin ist dies, weil der innere Prozess nicht in der Lage ist, mit dem mDNSResponder
Daemon verbinden außerhalb des Gefängnisses läuft. Außerhalb des Gefängnisses gibt es eine mDNSResponder
Buchse für das gesamte System zu verwenden:
host ➜ ls -lA /var/run/mDNSResponder
srw-rw-rw- 1 root daemon 0 22 Oct 10:41 /var/run/mDNSResponder
Aber im Gefängnis ist nicht da. Also hatte ich versucht, socat
zu verwenden, um einen Unix-Socket „Proxy“ aus dem Innern des Gefängnis nach außen, es zu schaffen: Ich betreiben socat
(Befehl unten) eine Buchse in meinem Gefängnis zu schaffen, und dann im Gefängnis laufen kräuselt wieder, aber curl noch gibt die gleiche Fehlermeldung. Ich sehe dies in syslog auf die ausführliche Protokollierung von mDNSResponder
mit SIGUSR1 nach dem Einschalten:
2015-10-26 5:32:30.835 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0
2015-10-26 5:32:30.835 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23271](socat)
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23271](socat)
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: Removing FD
2015-10-26 5:32:31.339 PM curl[23269]: dnssd_clientstub read_all(5) failed 0/4 0
2015-10-26 5:32:31.339 PM curl[23269]: dnssd_clientstub write_all(4) failed -1/28 32 Broken pipe
2015-10-26 5:32:31.341 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0
2015-10-26 5:32:31.341 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23272](socat)
2015-10-26 5:32:31.342 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS
2015-10-26 5:32:31.342 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23272](socat)
2015-10-26 5:32:31.342 PM mDNSResponder[95]: 12: Removing FD
2015-10-26 5:32:31.844 PM curl[23269]: dnssd_clientstub read_all(5) failed 0/4 0
2015-10-26 5:32:31.846 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0
2015-10-26 5:32:31.846 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23274](socat)
2015-10-26 5:32:31.847 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS
2015-10-26 5:32:31.847 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23274](socat)
2015-10-26 5:32:31.847 PM mDNSResponder[95]: 12: Removing FD
2015-10-26 5:32:32.349 PM curl[23269]: dnssd_clientstub read_all(5) failed 0/4 0
2015-10-26 5:32:32.350 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0
2015-10-26 5:32:32.351 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23275](socat)
2015-10-26 5:32:33.361 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23275](socat)
2015-10-26 5:32:33.361 PM mDNSResponder[95]: 12: Removing FD
die wie curl
über dnssd_clientstub
sieht für mich dreimal versucht, den Namen aufzulösen. Hier ist das socat
Protokoll, während der inhaftierte Prozess zu verbinden versucht:
host ~/C/jail (master*) ➜
sudo socat -v -d -d UNIX-LISTEN:/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder,mode=666,fork,user=root,group=daemon UNIX-CLIENT:/private/var/run/mDNSResponder
Password:
2015/10/26 18:16:03 socat[24334] N listening on LEN=67 AF=1 "/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder"
2015/10/26 18:16:07 socat[24334] N accepting connection from LEN=16 AF=1 "" on LEN=67 AF=1 "/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder"
2015/10/26 18:16:07 socat[24334] N forked off child process 24341
2015/10/26 18:16:07 socat[24334] N listening on LEN=67 AF=1 "/Users/hornairs/Code/jail/jail-test/private/var/run/mDNSResponder"
2015/10/26 18:16:07 socat[24341] N opening connection to LEN=32 AF=1 "/private/var/run/mDNSResponder"
2015/10/26 18:16:07 socat[24341] N successfully connected from local address LEN=16 AF=1 ""
2015/10/26 18:16:07 socat[24341] N starting data transfer loop with FDs [6,6] and [5,5]
> 2015/10/26 18:16:07.081847 length=28 from=0 to=27
............................< 2015/10/26 18:16:07.082019 length=4 from=0 to=3
....> 2015/10/26 18:16:07.082167 length=50 from=28 to=77
...............\b...............P.....google.ca....> 2015/10/26 18:16:07.082287 length=1 from=78 to=78
.2015/10/26 18:16:07 socat[24341] N socket 2 (fd 5) is at EOF
2015/10/26 18:16:07 socat[24341] N exiting with status 0
2015/10/26 18:16:07 socat[24334] N childdied(): handling signal 20
Zum Vergleich hier ist, was eine erfolgreiche Lookup aussieht, wenn ich es vom Host laufen:
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 501
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23190](curl)
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: Result code socket 27 created 00000000 00000001
2015-10-26 5:31:56.524 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(15000, 0, google.ca., Addr) START PID[23190]()
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: Result code socket 27 closed 00000000 00000001 (0)
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) ADD 4 google.ca. Addr 74.216.233.251
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) ADD 4 google.ca. Addr 74.216.233.249
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) ADD 4 google.ca. Addr 74.216.233.227
*snip*
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: Result code socket 27 created 00000000 00000002
2015-10-26 5:31:56.525 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(15000, 0, google.ca., AAAA) START PID[23190]()
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: Result code socket 27 closed 00000000 00000002 (0)
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., AAAA) ADD 16 google.ca. AAAA 2607:F8B0:400B:080A:0000:0000:0000:100F
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: Cancel 00000000 00000001
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., Addr) STOP PID[23190]()
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: Cancel 00000000 00000002
2015-10-26 5:31:56.526 PM mDNSResponder[95]: 12: DNSServiceQueryRecord(google.ca., AAAA) STOP PID[23190]()
2015-10-26 5:31:56.587 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23190](curl)
2015-10-26 5:31:56.587 PM mDNSResponder[95]: 12: Removing FD
Die wichtigsten Unterschiede Ich bemerke zwischen dem Fehler und dem Erfolg ist, dass uid
ist 0 für die Anfrage innerhalb der Gefängnis und 501 für die Anfrage außerhalb. Neugierig, aber das scheint nicht zu sein, wo die Anfrage tatsächlich fehlschlägt.
Die Fehlermeldung, die von mDNSResponder
kommt, scheint zu sein, die errsd
von der eingehenden Anfrage über den Socket zu bekommen. https://github.com/jevinskie/mDNSResponder/blob/2942dde61f920fbbf96ff9a3840567ebbe7cb1b6/mDNSShared/uds_daemon.c#L3660
An dieser Stelle scheint es mir, wie mDNSResponder
seine Kunden erwarten, dass ihnen ein Paar von fd die über den Sockel mit dem Kunden zu reagieren, passieren, was ich nicht sicher bin, ist sogar möglich, aus dem Innern des chroot zu tun. Ich bin ein sehr schlechter C-Programmierer, also könnte ich mich irren, aber wenn das die Wahrheit ist, ist es sogar möglich, dies zu tun, und gibt es einen besseren Weg, DNS innerhalb der Chroot zu arbeiten?
Andere Leckerbissen:
Sie können
mDNSResponder
konfigurieren auf mehr als eine Buchse hören darin launchd plist-Datei ist, aber diese Datei jetzt vom System Integritätsschutz geschützt ist, was ich will nicht deaktivieren um das zur Arbeit zu bringen. Es ist janky und einfach mit den Gefängnis-Dateisystemen nicht synchron fallen ich oft auf dem Hosts bin zu ändern, die DNS für jeden Prozess bricht, wenn es nicht eine der Buchsen erstellen kann, da die Datei nicht existiert. Die Ausführung eines Proxy scheint viel robusterping
stirbt sofort im Gefängnis, weshalb ichcurl
benutze. Es erhält sofort eineKilled: 9
Nachricht auf der Konsole.Ich bekomme einige andere Dateien in die Chroot mit einem Bind-Mount, aber ich kann nicht für den
mDNSResponder
Sockel arbeiten. Ich benutze http://bindfs.org (seit OS X nicht Linux nicht unterstütztmount --bind
‘) zu montieren, in/var/zum chroot laufen, aber dies kommt in den Protokollen auf, wenn versucht, eine Verbindung herzustellen:2015-10-26 6:39:40.833 PM curl[25002]: dnssd_clientstub ConnectToServer: connect()-> No of tries: 1 2015-10-26 6:39:41.837 PM curl[25002]: dnssd_clientstub ConnectToServer: connect()-> No of tries: 2 2015-10-26 6:39:42.843 PM curl[25002]: dnssd_clientstub ConnectToServer: connect()-> No of tries: 3 2015-10-26 6:39:43.848 PM curl[25002]: dnssd_clientstub ConnectToServer: connect() failed path:/var/run/mDNSResponder Socket:4 Err:-1 Errno:61 Connection refused
Auch der Hinweis: Ich kann nicht ein Duplikat mDNSResponder innerhalb der Chroot ausführen. Es wird sofort damit im Vordergrund getötet: 'bash-3.2 #/usr/sbin/mDNSResponder \ n Killed: 9' und dies in syslog:' kernel [0]: AMFI: hook..execve() kill pid 26798: nicht erlaubt in chroot' – hornairs