12 votes

Comment corriger les erreurs SELinux "avc : denied" lors du lancement de DNSCrypt comme script init.d ?

J'ai installé une ROM non officielle Lineage OS 14.1 sur mon téléphone et je veux que dnscrypt soit utilisé par défaut au démarrage.

Voilà ce que j'ai fait :

  1. Téléchargez les binaires arm depuis : https://github.com/jedisct1/dnscrypt-proxy/releases

  2. Poussez dnscrypt-proxy dans /system/xbin

  3. Pousser dnscrypt-proxy.toml dans /etc/dnscrypt-proxy/

  4. J'ai créé le script suivant : /etc/init.d/99dnscrypt

    #!/system/bin/sh
    log -p i -t dnscrypt "Starting dnscrypt-proxy..."
    dnscrypt-proxy -config /system/etc/dnscrypt-proxy/dnscrypt-proxy.toml &
    log -p i -t dnscrypt "Changing dns with iptables..."
    iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
  5. Redémarrer

Maintenant, si je lance 99dnscrypt en tant que Root depuis adb, cela fonctionne comme un charme.

Mais au démarrage, ce n'est pas le cas.

Sur logcat je vois ces erreurs :

02-07 01:00:22.369   267   267 I sysinit : Running /system/etc/init.d/99dnscrypt 
02-07 01:00:22.540   275   275 I dnscrypt: Starting dnscrypt-proxy... 
02-07 01:00:22.878   278   278 I dnscrypt: Changing dns with iptables... 
02-07 01:00:23.236   277   277 W dnscrypt-proxy: type=1400 audit(0.0:28): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:23.236   277   277 W dnscrypt-proxy: type=1300 audit(0.0:28): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=274 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:24.238   277   277 W dnscrypt-proxy: type=1400 audit(0.0:45): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:24.238   277   277 W dnscrypt-proxy: type=1300 audit(0.0:45): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:28.242   277   277 W dnscrypt-proxy: type=1400 audit(0.0:82): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:28.242   277   277 W dnscrypt-proxy: type=1300 audit(0.0:82): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:29.233   277   277 W dnscrypt-proxy: type=1400 audit(0.0:94): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:29.233   277   277 W dnscrypt-proxy: type=1300 audit(0.0:94): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:30.234   277   277 W dnscrypt-proxy: type=1400 audit(0.0:105): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:30.234   277   277 W dnscrypt-proxy: type=1300 audit(0.0:105): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:31.235   277   277 W dnscrypt-proxy: type=1400 audit(0.0:121): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:31.235   277   277 W dnscrypt-proxy: type=1300 audit(0.0:121): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:32.236   277   277 W dnscrypt-proxy: type=1400 audit(0.0:145): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:32.236   277   277 W dnscrypt-proxy: type=1300 audit(0.0:145): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:33.247   458   458 W dnscrypt-proxy: type=1400 audit(0.0:146): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:33.247   458   458 W dnscrypt-proxy: type=1300 audit(0.0:146): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:34.248   458   458 W dnscrypt-proxy: type=1400 audit(0.0:147): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:34.248   458   458 W dnscrypt-proxy: type=1300 audit(0.0:147): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:35.249   458   458 W dnscrypt-proxy: type=1400 audit(0.0:148): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:35.249   458   458 W dnscrypt-proxy: type=1300 audit(0.0:148): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:36.250   458   458 W dnscrypt-proxy: type=1400 audit(0.0:149): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:36.250   458   458 W dnscrypt-proxy: type=1300 audit(0.0:149): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:37.251   458   458 W dnscrypt-proxy: type=1400 audit(0.0:150): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:37.251   458   458 W dnscrypt-proxy: type=1300 audit(0.0:150): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:38.242   458   458 W dnscrypt-proxy: type=1400 audit(0.0:151): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:38.242   458   458 W dnscrypt-proxy: type=1300 audit(0.0:151): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:39.244   458   458 W dnscrypt-proxy: type=1400 audit(0.0:152): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:39.244   458   458 W dnscrypt-proxy: type=1300 audit(0.0:152): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:40.245   458   458 W dnscrypt-proxy: type=1400 audit(0.0:153): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:40.245   458   458 W dnscrypt-proxy: type=1300 audit(0.0:153): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:41.246   458   458 W dnscrypt-proxy: type=1400 audit(0.0:154): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:41.246   458   458 W dnscrypt-proxy: type=1300 audit(0.0:154): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:42.247   458   458 W dnscrypt-proxy: type=1400 audit(0.0:155): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:42.247   458   458 W dnscrypt-proxy: type=1300 audit(0.0:155): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:43.248   458   458 W dnscrypt-proxy: type=1400 audit(0.0:156): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:43.248   458   458 W dnscrypt-proxy: type=1300 audit(0.0:156): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:44.249   458   458 W dnscrypt-proxy: type=1400 audit(0.0:157): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:44.249   458   458 W dnscrypt-proxy: type=1300 audit(0.0:157): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:46.251   458   458 W dnscrypt-proxy: type=1400 audit(0.0:185): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:46.251   458   458 W dnscrypt-proxy: type=1300 audit(0.0:185): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:47.252   458   458 W dnscrypt-proxy: type=1400 audit(0.0:186): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:47.252   458   458 W dnscrypt-proxy: type=1300 audit(0.0:186): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:48.243   458   458 W dnscrypt-proxy: type=1400 audit(0.0:187): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:48.243   458   458 W dnscrypt-proxy: type=1300 audit(0.0:187): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:49.254   458   458 W dnscrypt-proxy: type=1400 audit(0.0:188): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:49.254   458   458 W dnscrypt-proxy: type=1300 audit(0.0:188): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:50.255   458   458 W dnscrypt-proxy: type=1400 audit(0.0:189): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:50.255   458   458 W dnscrypt-proxy: type=1300 audit(0.0:189): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:51.256   458   458 W dnscrypt-proxy: type=1400 audit(0.0:190): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:51.256   458   458 W dnscrypt-proxy: type=1300 audit(0.0:190): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:52.257   458   458 W dnscrypt-proxy: type=1400 audit(0.0:191): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:52.257   458   458 W dnscrypt-proxy: type=1300 audit(0.0:191): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:53.259   458   458 W dnscrypt-proxy: type=1400 audit(0.0:192): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:53.259   458   458 W dnscrypt-proxy: type=1300 audit(0.0:192): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:54.260   458   458 W dnscrypt-proxy: type=1400 audit(0.0:193): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:54.260   458   458 W dnscrypt-proxy: type=1300 audit(0.0:193): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:55.261   458   458 W dnscrypt-proxy: type=1400 audit(0.0:194): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:55.261   458   458 W dnscrypt-proxy: type=1300 audit(0.0:194): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:56.262   458   458 W dnscrypt-proxy: type=1400 audit(0.0:195): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:56.262   458   458 W dnscrypt-proxy: type=1300 audit(0.0:195): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:57.253   458   458 W dnscrypt-proxy: type=1400 audit(0.0:196): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:57.253   458   458 W dnscrypt-proxy: type=1300 audit(0.0:196): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:58.254   458   458 W dnscrypt-proxy: type=1400 audit(0.0:197): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:58.254   458   458 W dnscrypt-proxy: type=1300 audit(0.0:197): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:00:59.255   458   458 W dnscrypt-proxy: type=1400 audit(0.0:198): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:00:59.255   458   458 W dnscrypt-proxy: type=1300 audit(0.0:198): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:01:00.256   458   458 W dnscrypt-proxy: type=1400 audit(0.0:203): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:01:00.256   458   458 W dnscrypt-proxy: type=1300 audit(0.0:203): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:01:01.257   458   458 W dnscrypt-proxy: type=1400 audit(0.0:204): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:01:01.257   458   458 W dnscrypt-proxy: type=1300 audit(0.0:204): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)
02-07 01:01:02.258   458   458 W dnscrypt-proxy: type=1400 audit(0.0:207): avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0
02-07 01:01:02.258   458   458 W dnscrypt-proxy: type=1300 audit(0.0:207): arch=40000028 syscall=281 per=800008 success=no exit=-13 a0=2 a1=80802 a2=0 a3=b674a934 items=0 ppid=1 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 exe="/system/bin/dnscrypt-proxy" subj=u:r:sysinit:s0 key=(null)

Quelle est la différence entre exécuter ceci en tant que Root après le démarrage et le lancer depuis init.d ? Une idée de la façon dont je peux résoudre ce problème ?

17voto

Irfan Latif Points 16863

Pardonnez-moi si je ne parviens pas à résumer ce vaste sujet en une brève réponse :)

SELINUX ET REFUS DE L'AVC

Android est basé sur le noyau Linux qui utilise les contrôles d'accès discrétionnaire et obligatoire (DAC, MAC) pour restreindre l'accès aux ressources du système telles que les fichiers sur un certain système de fichiers. Les DAC comprennent les systèmes UNIX classiques RWX modes de fichiers, propriétaire/groupe ou UID/GID, attributs étendus et listes de contrôle d'accès. XATTR et ACL sont des attributs rarement utilisés dans les systèmes de fichiers, bien que MAC utilise également les XATTR. L'utilisateur racine (UID : 0) est le propriétaire du fichier. super user (administrateur) dans le mécanisme DAC qui peut contourner tous les contrôles de permission imposés par le noyau. Pour rendre les contrôles plus fins, les autorités de l'utilisateur Root sont encore divisées en sous-groupes appelés capacités .

En ce qui concerne le MAC, SELinux et AppArmor sont des mécanismes de contrôle d'accès obligatoire couramment utilisés. Dans le modèle SELinux, chaque fichier/processus est étiqueté avec un contexte et des règles sont définies pour permettre à un contexte d'accéder à un autre.
Disons que nous voulons exécuter la commande ls avec le contexte my_process sur un fichier avec le contexte my_file Une règle doit être définie pour autoriser cet accès :

allow my_process my_file file { getattr read open }

Sinon, l'accès sera refusé avec une erreur du type :

avc: denied { open } for pid=... comm="ls" path=... scontext=u:object_r:my_process:s0 tcontext=u:object_r:my_file:s0 tclass=file permissive=0

* Les étiquettes SELinux des fichiers peuvent être modifiées avec chcon alors que les processus peuvent être lancés avec un contexte donné en utilisant runcon commandement.

SELINUX DANS Android

Android utilise SELinux dans le cadre de son les applications de sécurité . Lorsqu'une ROM est compilée pour un dispositif spécifique, des milliers de règles de politique SE sont définies pour permettre tous les accès possibles et souhaités. Ces règles sont compilées dans un fichier binaire /sepolicy qui est placé à la racine de l'initramfs en boot.img . Ce fichier est chargé au début du processus de démarrage par init ; le tout premier processus qui lance tous les autres processus.
Init démarre également différents processus/services avec différents contextes tels que définis dans leur init *.rc des fichiers.
Toutes les étiquettes du système de fichiers sont stockées dans plusieurs fichiers enregistrés dans rootfs ou à l'emplacement de /system/etc/selinux/*_contexts , /vendor/etc/selinux/*_contexts etc. Ces étiquettes peuvent être restaurées par restorecon commandement.

ENRACINEMENT ET SELINUX

Maintenant, si vous voulez lancer un processus avec un contexte différent qui n'a pas été explicitement autorisé dans la politique de SE, vous devez définir de nouvelles règles. Cependant, cela n'est pas possible dans des circonstances normales car le DAC, le MAC et les capacités ensemble ne vous permettront pas de le faire. C'est là qu'intervient le rooting du téléphone ; prenons l'exemple de Magisk.
Magisk démarre un démon comme service init qui permet à tout processus non privilégié de demander les droits de super utilisateur. Le problème de l'UID 0 et du manque de capacités est donc résolu. Afin d'aborder les dénis SELinux, Magisk définit deux nouveaux contextes : magisk pour les processus et magisk_file pour le système de fichiers. Ensuite, des règles sont définies pour autoriser toutes les tentatives d'accès depuis/vers ces contextes et /sepolicy est remplacé par le fichier de politique modifié. A partir de maintenant, tous les processus s'exécutant avec des droits Magisk ne seront pas interdits de faire quoi que ce soit. Cela pourrait être vraiment dangereux.

Venons-en maintenant à votre question,
Vous démarrez un processus avec un contexte u:r:sysinit:s0 qui n'est pas autorisé par la politique à accéder à toutes les ressources dont il a besoin. Donc ce que vous pouvez faire c'est :

OPTION 1 :
Exécutez les scripts init.d avec les privilèges de Root et oubliez les dénis ; DAC ou MAC. Magisk, par exemple, exécute les scripts placés en /data/adb/*.d au démarrage.
Mais en tant que pratique courante, les processus ne devraient pas se voir accorder des privilèges inutiles.

OPTION 2 :
Définir SELinux permissif :

/system/bin/setenforce 0
# OR
echo 0 >/sys/fs/selinux/enforce

Mais cela désactive SELinux pour tout le dispositif, ce qui n'est pas recommandé. Donc à la place :

OPTION 3 :
Ensemble seulement sysinit a permissive :

/sbin/supolicy --live 'permissive sysinit'
# or let sysinit do anything without logging denials
/sbin/supolicy --live 'allow sysinit * *'

* supolitique fait partie de Magisk pour manipuler la politique SELinux. Vous pouvez également utiliser sepolicy-injecter ou un outil similaire.

Toutes les solutions ci-dessus sont une solution rapide, mais si vous ne voulez pas laisser de traces, allez-y.

OPTION 4 :
Nous pouvons définir des règles de SEPolicy pour sysinit et l'enregistrer comme politique par défaut à charger au démarrage. Par exemple, le refus d'avc dans votre journal :

avc: denied { create } for scontext=u:r:sysinit:s0 tcontext=u:r:sysinit:s0 tclass=udp_socket permissive=0

peut être converti en une règle SEPolicy :

allow sysinit sysinit udp_socket { create }

sysinit est un service init ajouté à certaines ROMs personnalisées qui exécute des scripts sous le nom de /system/etc/init.d/ mais ce n'est pas un service AOSP standard et l'UID, le GID, les groupes supplémentaires, les capacités et les contextes SELinux avec lesquels ce service fonctionne peuvent différer sur différents appareils.
Donc, d'un point de vue plus général, créons une nouvelle dnscrypt-proxy service init avec le contexte désiré et en plus avec les UID/GID/groupes/capacités désirés pour accorder les privilèges les moins requis.

COMMENT AJOUTER UN SERVICE D'INITIATION PERSONNALISÉ À Android ?

  1. Placez le binaire exécutable à /system/xbin/dnscrypt-proxy

  2. Créer un répertoire /etc/dnscrypt-proxy fichier de configuration /etc/dnscrypt-proxy/dnscrypt-proxy.toml et éventuellement /etc/dnscrypt-proxy/blacklist.txt si nécessaire.

     listen_addresses = ['127.0.0.1:55']
    
     [blacklist]
       blacklist_file = '/system/etc/dnscrypt-proxy/blacklist.txt'
    
     [static]
       [static.'cloudflare']
       stamp = 'sdns://AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk'
  • J'utilise ici le port 55 parce que sinon dnsmasq ne parviendra pas à écouter sur le port 53 pré-occupé lorsque le tethering est activé, ce qui fera échouer le hotspot.
  • DNS privé (DoT) introduite dans Android Pie n'utilise pas le port 53. Pour appliquer dnscrypt-proxy Le DNS privé doit être désactivé.
  1. Créer /etc/init/dnscrypt-proxy.rc .

     # define service
     service dnscrypt-proxy /system/bin/logwrapper /system/xbin/dnscrypt-proxy -config /system/etc/dnscrypt-proxy/dnscrypt-proxy.toml
         seclabel u:r:dns_crypt:s0
         user 999
         group 999 3003
         disabled
         capabilities NET_BIND_SERVICE
    
     # start dnscrypt-proxy after netd daemon
     on property:init.svc.netd=running
         start dnscrypt-proxy
    
     # redirect all DNS queries to dnscrypt-proxy
     on property:init.svc.dnscrypt-proxy=running
         exec u:r:dns_crypt:s0 root root -- /system/bin/iptables -w 60 -t nat -I OUTPUT -p udp --dport 53 -j DNAT --to 127.0.0.1:55
     on property:init.svc.dnscrypt-proxy=stopped
         exec u:r:dns_crypt:s0 root root -- /system/bin/iptables -w 60 -t nat -D OUTPUT -p udp --dport 53 -j DNAT --to 127.0.0.1:55
  • Le processus n'a pas besoin d'être exécuté en tant que Root. Utilisez l'UID 999 non privilégié ou tout autre UID non utilisé par le système d'exploitation Android .

  • Pour accéder à l'internet, le processus doit être en groupe. aid_inet (3003) ou avoir la capacité NET_RAW (créer socket ), et devrait avoir la capacité NET_BIND_SERVICE ( bind à la prise).

  • Si vous utilisez un pare-feu (comme AFWall+) pour bloquer le trafic sortant, vous devez autoriser explicitement l'UID 999 à chaque démarrage :

         ~# iptables -I OUTPUT -m owner --uid-owner 999 -j ACCEPT
  • Pour faire passer le trafic de l'hôte par dnscrypt-proxy :

         ~# iptables -t nat -I PREROUTING -p udp --dport 53 -j DNAT --to 127.0.0.1:55
         ~# echo -n 1 >/proc/sys/net/ipv4/conf/all/route_localnet
  1. Définir les règles SEPolicy :

     ~# supolicy --live 'create dns_crypt'                  # create new context
     ~# supolicy --live 'allow init dns_crypt process *'    # let init handle the service
     ~# supolicy --live 'allow dns_crypt dns_crypt * *'     # allow mutual love

De la même manière :

    # allow access to files under /system
        allow dns_crypt system_file dir { read open }
        allow dns_crypt system_file file { lock entrypoint execute_no_trans }
    # allow creatig/connecting to net sockets
        allow dns_crypt node tcp_socket { node_bind }
        allow dns_crypt node udp_socket { node_bind }
        allow dns_crypt port tcp_socket { name_bind name_connect }
        allow dns_crypt port udp_socket { name_bind }
    # allow reading /proc and /dev filesystem
        allow dns_crypt proc_net file { open read }
        allow dns_crypt proc_stat file { read }
        allow dns_crypt properties_device dir { read }
    # allow writing to logcat, logging to file requires different AVC rules
        allow dns_crypt devpts chr_file { open read write }
  • C'est ce qui fonctionne pour moi sur AEX Pie ROM. Cependant les étiquettes et les contextes peuvent légèrement différer sur différentes versions d'Android et sur différents téléphones.

  • Pour les tests, vous pouvez définir SELinux permissif au démarrage en ajoutant temporairement une ligne à dnscrypt-proxy.rc fichier :

         ...
         ...
         on property:init.svc.netd=running
             exec u:r:magisk:s0 root root -- /system/bin/setenforce 0
             start dnscrypt-proxy
         ...
         ...

    Ensuite, utilisez dmesg pour voir les refus de l'avc et définir d'autres règles.

  1. Sauvegarder et charger le fichier de politique.

     ~# supolicy --save /etc/selinux/sepolicy

L'injection en direct d'un grand nombre de règles dans une politique prend plus de temps. Comme ces règles doivent être chargées à chaque démarrage, enregistrez-les dans un fichier de politique par défaut.

  • Déballez boot.img et remplacer le /sepolicy avec le vôtre. De cette façon, le Le service fonctionnera même si le téléphone n'est pas enraciné. .

  • Cependant, si vous ne voulez pas modifier boot.img vous pouvez utiliser l'aide de Magisk pour charger une politique personnalisée au démarrage avant que le système de gestion de l'information ne soit activé. dnscrypt-proxy est lancé. C'est parce que même init ne peut pas, à lui seul, charger une politique personnalisée une fois que SELinux est configuré pour appliquer la politique par défaut.

         ...
         ...
         on property:init.svc.netd=running
             exec u:r:magisk:s0 root root -- /system/bin/load_policy /system/etc/selinux/sepolicy
             start dnscrypt-proxy
         ...
         ...
  1. Définir les autorisations et fixer les contextes :

     ~# chmod 0755 /etc/dnscrypt-proxy /system/xbin/dnscrypt-proxy
     ~# chmod 0644 /etc/init/dnscrypt-proxy.rc /etc/dnscrypt-proxy/* /etc/selinux/sepolicy
     ~# restorecon -Rv /system/xbin/dnscrypt-proxy /etc/*
  2. Redémarrage.

Vous avez un inoffensif, l'air innocent dnscrypt-proxy en cours d'exécution sur votre appareil.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X