CGIからのパーミッション

投稿者: Anonymous

Webから操作するリモコンカメラを作ろうとしています。

左右回転するモータドライバをGPIOでON、OFFさせるmotor_rotate.shをお手軽にbashで作り
所有者:グループをroot:rootとし、SUIDを付与しました。

-rwsr-xr-x 1 root  root   898 Aug  9 10:25 motor_rotate.sh

このスクリプトをuser権限で実行できることを確認しました。

次に、motor_rotate.shを呼び出すCGI、cam_ctl.pyをPythonで作りました。

-rwxr-xr-x 1 root root 190 Aug 10 07:08 cam_ctl.py

しかし、ブラウザからこのCGIを実行すると以下のエラーになり、

The server encountered an internal error or misconfiguration and was unable to complete your request.

apache2/error.logは次のようになります。

/home/user1/bin/motor_rotate.sh: 20: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/export: Permission denied
/home/user1/bin/motor_rotate.sh: 22: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/direction: Permission denied
/home/user1/bin/motor_rotate.sh: 23: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
/home/user1/bin/motor_rotate.sh: 34: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
/home/user1/bin/motor_rotate.sh: 38: /home/user1/bin/motor_rotate.sh: cannot create /sys/class/gpio/gpio23/value: Permission denied
[Fri Aug 10 07:41:09.833310 2018] [cgid:error] [pid 18429:tid 2985292848] [client 192.168.12.150:50335]
 End of script output before headers: cam_ctl.py, referer: http://192.168.12.103:80/

どのように対処したらよいでしょうか?
そもそも、CGIの実行者は誰になっているのでしょうか?
よろしくお願いいたします。

ちなみに、motor_rotate.shはこんな感じです(略してますので、行番号は違います)

#!/bin/sh
SWITCH1="/sys/class/gpio/gpio23"

if [ ! -e $SWITCH1 ]; then
    echo 23 > /sys/class/gpio/export
    sleepenh 0.1 > /dev/null
    echo out > $SWITCH1/direction
    echo 0 > $SWITCH1/value
fi

echo 1 > $SWITCH1/value
sleepenh 0.5 > /dev/null
echo 0 > $SWITCH1/value

追伸、AMD64版Debinaでテストしてみたんですが
-rwxr-xr-x 1 user1 user1 73 8月 10 17:01 test.py
-rwsr-xr-x 1 root root 30 8月 10 17:00 test.sh

test.sh

#! /bin/sh
echo "Hello World"

test.sh

#! /usr/bin/python
import subprocess
res = subprocess.call("./test.sh")

[email protected]:~$ ./test.py
Hello World

このテストでは、問題いなく動くんです、何か間違ってるのかな

解決

shスクリプトはsetuid指定が効かないと記憶しています。そのため、期待通りに動作しないと予想します。

#shの挙動か、OS(Linux)の挙動かまでは覚えていませんが、セキュリティ対策のためです。

別のスクリプトで作成しsetuidを指定するか、スクリプトを呼び出すnative executableを作成し、それをsetuidするかすれば、期待通り動作させられるようになると思います。

#追記の動作実験では、test.shはrootユーザでは動作していないのでは、と予想します。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *