2010年10月07日
Android on Ubuntuで一般ユーザでのsocketシステムコールがPermission deniedになる
Android on Ubuntu で、なぜか一般ユーザでsocketシステムコールがPermission deniedになってしまいます。sudo すれば大丈夫です。
この問題に気がついてはいたのですが、きっとUbuntuの新しいセキュリティの設定が何か足りないせいだろうと思っていました。しかし、Debianで動かしても同じことがおきました。
このことをたまたまtwitterでつぶやいたら、有力な情報を教えてもらったので調べてみました。
一般ユーザでsocketシステムコールがPermission deniedになるというのはこんなことです。
user@arm-lucid:~$ ping 192.168.1.26 socket: Permission denied
sudoでルート権限で実行すると成功します。
user@arm-lucid:~$ sudo ping 192.168.1.26 [sudo] password for user: PING 192.168.1.26 (192.168.1.26) 56(84) bytes of data. 64 bytes from 192.168.1.26: icmp_seq=1 ttl=64 time=0.168 ms 64 bytes from 192.168.1.26: icmp_seq=2 ttl=64 time=0.137 ms 64 bytes from 192.168.1.26: icmp_seq=3 ttl=64 time=0.142 ms 64 bytes from 192.168.1.26: icmp_seq=4 ttl=64 time=0.147 ms 64 bytes from 192.168.1.26: icmp_seq=5 ttl=64 time=0.125 ms ^C --- 192.168.1.26 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4000ms rtt min/avg/max/mdev = 0.125/0.143/0.168/0.020 ms user@arm-lucid:~$
straceで見てみると、確かにsocketのシステムコールがPermission deniedのエラーになっています。
user@arm-lucid:~$ strace ping 192.168.1.26 execve("/bin/ping", ["ping", "192.168.1.26"], [/* 15 vars ... munmap(0x40018000, 15575) = 0 socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = -1 EACCES (Permission denied) getuid32() = 1000 setuid32(1000) = 0 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = -1 EACCES (Permission denied) dup(2) = 3 ...
実はこれはAndroidのためにパッチをカーネルにあてたことが関係していました。これです。
net/Kconfig
config ANDROID_PARANOID_NETWORK bool "Only allow certain groups to create sockets" default y help none
Androidではある限定されたグループに属するユーザしかsocketを生成できないように制限がきつくなっていました。
とりあえずこれを無効にしてカーネルをビルドしなおすと通常どおり、一般ユーザでもpingや他のネットワークが関連するコマンドを正常に使うことができるようになりました。
後でまたこの仕組みを詳しく調べて、Ubuntu側で適切なグループ設定をして、このCONFIG_ANDROID_PARANOID_NETWORKを有効にしても問題がないようにしてみようと思います。
関連するページ
トラックバックURL
トラックバック一覧
1. KZM-CA9-01ボードのリンク集 Links related KZM-CA9-01(Quad core Cortex-A9 board) [ KMC Staff Blog ] 2010年10月07日 17:37
4コアのCortex-A9のKZM-CA9-01ボードを使って実験したことを書いたページをまとめてみました。