y.nakamura
2016年4月19日 0時31分
中村です。
たぶん、200シリーズ(9含む)以外のほとんどのMakefileが
該当すると思うのですが、400シリーズ、800シリーズ、
それから、IoTとBox WS1を選択しました。
(300と500は使ったことがないので入れてません。
IoT-G3もまだ使ってないので除外しておきました)
たとえば、ベンダディレクトリのArmadillo-IoTG-Stdの
Makefileに次の行があります。
find $(ROMFSDIR)/usr/bin -type f -exec chmod 755 {} +
このusr/binの下のもの全てに対するchmodは
何のために必要なのでしょうか?
この疑問が出てきた理由は次のとおりです。
atmark-distの下でmakeをするとベンダーディレクトリの下と
userの下など全部に対してmake all を実行します。
また、make romfs も、ベンダーディレクトリの下と
userの下など全部に対してmake romfs を実行します。
userの下のある特定のコマンドのソースを直したときや、
ベンダーの下のちょっとしたものだけを修正したときに、
(ベンダーの下は、etcの下だけということもよくあります)
全部のサブディレクトリをallやromfsでmakeするのは
作業効率が悪いので、
make user/hoge_only
make user/hoge_romfs
や
make vendor_romfs
などを使って、特定のディレクトリの下だけをmakeする
ことがあります。
(トップのMakefileの"%_only:"、"%_romfs:"、
"vendor_%:"などのターゲットを使います)
ベンダーディレクトリのMakefileでromfsを実行すると、
最初に書いた
find $(ROMFSDIR)/usr/bin -type f -exec chmod 755 {} +
によって、romfs/usr/binの下のすべてのファイルのパーミッションが
755に書き換えられてしまいます。
これにより、romfs/usr/sudoのsetuidビットが落ちてしまい、
sudoができなくなることに、最近気づきました。
sudoのsetuidビットは、user/sudo/Makefileのromfsの
次の処理で設定されています。
romfs: $(ROMFSINST) /usr/bin/sudo chmod 4611 $(ROMFSDIR)/usr/bin/sudo
--
なかむら
コメント
y.nakamura
中村です。
yashiさん、
説明ありがうございます。
文脈から誤記はわかると思いますが、元の私の1ヵ所訂正しておきます。
> > これにより、romfs/usr/sudoのsetuidビットが落ちてしまい、
は、romfs/usr/bin/sudo です。
> この副作用によって不具合を数回出したことがあるので、bin/以下には強制的
> に実行権限を付けるように変更しました。これ以上の権限の変更は、起動時に
バイナリのディレクトリはbin,usr/bin,sbin,usr/sbinとあるのに
usr/binの下だけchmodしているのは、プロダクトディレクトの下は
usr/binだけなので、そこからromfに入れたものに対して+xを
したかったということのようですね。
本来ならば、プロダクトディレクトリ/usr/bin/の下にあるファイルだけ、
romfs/usr/binから探してchmodするように、もう少し手間をかけて
Makefileを書くべきと思います。findで一括全部というのではなく。
そうすれば、他のプログラム、たとえば今回のsudoのパーミッションを
勝手に書き換えてしまうことはなくなりますから。
--
なかむら
at_yashi
2016年4月19日 10時34分
> このusr/binの下のもの全てに対するchmodは
> 何のために必要なのでしょうか?
昔々、まだ git が世の中に無いころ、Atmark Dist は patch で管理されてました。
普通のパッチは、ファイルのパーミッションを管理する機能がありません。そ
のため、例えば shell スクリプトを追加するようなパッチがあって、開発者
がシェルスクリプト自体にパーミッションを付けていても、patch がマージさ
れると、実行権限が落ちてしまいます。
この副作用によって不具合を数回出したことがあるので、bin/以下には強制的
に実行権限を付けるように変更しました。これ以上の権限の変更は、起動時に
変更するようにしています。
> これにより、romfs/usr/sudoのsetuidビットが落ちてしまい、
> sudoができなくなることに、最近気づきました。
たしかに seuid のファイルには影響がありますね。