2015-10-26 14 views
11

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 robuster

  • ping stirbt sofort im Gefängnis, weshalb ich curl benutze. Es erhält sofort eine Killed: 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ützt mount --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 
    
+0

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

Antwort

0

Sie sollten Stellen Sie sicher, dass Sie eine Kopie von /etc/resolv.conf in Ihrer Chroot haben. Ohne es würde es nicht wissen, welche DNS-Server zu kontaktieren, so dass die einzige Fallback-Option ist, mDNS zu verwenden. Aber selbst wenn mDNS funktionieren würde, könnte es wahrscheinlich nur lokale Domain-Namen damit auflösen, und nicht google.ca.