🐙

setuidやsetgidはどうしてあるのか

に公開

最近、セキュリティの本を読んでいて、setuidやsetgidの記述がありました。
uidやgidに関してはなんとなくの理解をしていたのですが、どうしてこのようなビットがあるのか理解が出来てませんでした。

このsetuidやsetgidを行うと、一般ユーザーでも対象のファイルの実行時には権限が昇格されてrootユーザーの権限などで実行ができるようになる。

設定方法としてはchmodで行う様子

$ chmod u+s sample
$ chmod g+s sample

u+sが所有ユーザーレベルの権限(setuid)、g+sがグループレベルの権限(setgid)がsample実行時に与えられます。

当初、この権限を昇格してファイルを実行できるというのはどういったメリットがあるのかあまりわかりませんでした。パーミッションで指定しとけばええやんとか思ってました。

私の調べた限りだと、間接的に権限が必要なファイルを変更させるようなときにこのフラグを利用するのが良いということがわかりました。

例としてよく出されるのはパスワード変更です。
パスワード自体の情報は/etc/shadowファイルに保存されています。
shadowファイルは一般的にルートユーザーしか読み書きが出来ないようになっており、一般ユーザーはこのファイルを編集することが出来ません。(自分以外の情報も乗っているので書き換えられたりすると困るため)

そこで、passwdコマンドを利用して通常はパスワードを切り替えます。
このpasswdプログラムファイルにsetuidが設定されているため、ユーザーが/etc/shadowファイルをpasswdコマンドを通して書き換えることが出来ます。

対象のpasswdコマンドに不備があればroot権限が利用できてしまうため、setuidやsetgidといったフラグは気を付けて付ける必要がある。

Discussion