sudoに10年以上前から存在した特権昇格の脆弱性が修正される 40
ストーリー by headless
***** 部門より
***** 部門より
sudoに10年以上前から存在した脆弱性(CVE-2019-18634)が1月30日リリースのsudo 1.8.31で修正されている(sudoのアドバイザリ、 Ars Technicaの記事、 Softpediaの記事)。
この脆弱性はsudoでパスワード入力時にアスタリスク(*)を表示するオプション「pwfeedback」が有効になっている場合、ユーザーがスタックベースのバッファーオーバーフローを引き起こす可能性があるというもの。sudoが許可されていないユーザーでも実行でき、悪用することで特権のないユーザーがroot権限に昇格する可能性がある。
脆弱性の原因となるバグ自体はsudo 1.7.1~1.8.30に存在するが、sudo 1.8.26で導入された変更により、実際に悪用可能なのはsudo 1.7.1~1.8.25p1となる。pwfeedbackはアップストリームのsudoや多くのパッケージのデフォルトでは有効になっていないものの、Linux MintやElementary OSなどデフォルトで有効になっているシステムも存在するとのこと。
影響を受けるバージョンのsudoは1.8.31へのアップグレードが推奨されるが、sudoerファイルでpwfeedbackを無効にすることで悪用の回避には十分だ。pwfeedbackが有効になっているかどうかは「sudo -l」コマンドで確認できる。「Matching Defaults entries」の出力にpwfeedbackが含まれていれば有効になっているので、sudoerファイルの「Defaults pwfeedback」を「Defaults !pwfeedback」に変更すれば無効化できるとのことだ。
この脆弱性はsudoでパスワード入力時にアスタリスク(*)を表示するオプション「pwfeedback」が有効になっている場合、ユーザーがスタックベースのバッファーオーバーフローを引き起こす可能性があるというもの。sudoが許可されていないユーザーでも実行でき、悪用することで特権のないユーザーがroot権限に昇格する可能性がある。
脆弱性の原因となるバグ自体はsudo 1.7.1~1.8.30に存在するが、sudo 1.8.26で導入された変更により、実際に悪用可能なのはsudo 1.7.1~1.8.25p1となる。pwfeedbackはアップストリームのsudoや多くのパッケージのデフォルトでは有効になっていないものの、Linux MintやElementary OSなどデフォルトで有効になっているシステムも存在するとのこと。
影響を受けるバージョンのsudoは1.8.31へのアップグレードが推奨されるが、sudoerファイルでpwfeedbackを無効にすることで悪用の回避には十分だ。pwfeedbackが有効になっているかどうかは「sudo -l」コマンドで確認できる。「Matching Defaults entries」の出力にpwfeedbackが含まれていれば有効になっているので、sudoerファイルの「Defaults pwfeedback」を「Defaults !pwfeedback」に変更すれば無効化できるとのことだ。
パスワード入力時にアスタリスク(*)を表示するオプション (スコア:1)
Linux使って20年以上になるけど、sudoに pwfeedback なんてものがあったことを今の今まで知らなかった。
どの層のためにあるんだこれ?
あんだけボロクソ言われてるsystemd-logindですら、そんなしょうもないオプション増やそうとした形跡すらないだろ。
ところで「pwfeedbackが有効になっているかどうかは「sudo -l」コマンドで確認できる。」とあるが、
そもそもその「sudo -l」自体がパスワード必須なのだから、有効になっているかどうかもなにも
アスタリスクが出るかどうかその時点でわかるやろ。
Re:パスワード入力時にアスタリスク(*)を表示するオプション (スコア:1)
sudoersにNOPASSWDって書いてあってパスワード必須じゃなかったりして?
今自分が入力した文字が本当に入っているかわからないと困る時はときどきある。著しく回線の品質が悪いときとか、なんのドライバの不良か速くタイプすると取りこぼしを起こす端末を使っているときとか。
Re: (スコア:0)
安物KVMに、キーを秒間に一定以上打つと取りこぼす奴有りますね。
Re: (スコア:0)
だろ。やろ。
Re:パスワード入力時にアスタリスク(*)を表示するオプション (スコア:1)
ますよね
壊れていないものを直そうとする (スコア:0)
その昔、OpenSSLにあった脆弱性も
必要性が理解されない機能が規格に組み込まれたことに端を発しているわけで [blogspot.com]、
必要かどうか解らない機能も、誰かによって発案され、
誰も興味がないからチェックされず、
10年以上も放置されたのでは?
Re: (スコア:0)
sudoはPOSIXに定められた機能ではないから純粋にsudoの開発者にアホがいるだけだろ。そんなアホがUNIXの重要なセキュリティ機能の開発に関わっているというのは慄然とせざるを得ないが
Re: (スコア:0)
POSIXでないからアホがいる、ってよくわからん理屈だな
Re: (スコア:0)
どういう悪意ある解釈をすればそうなるのか。
責任の所在について言ってるだけでしょ。
Re: (スコア:0)
「sudoが悪いのはPOSIXを策定しているIEEEのせい」と誤解させてしまったことは、すまない。
sudoコマンドは複数人が開発にかかわっており、その中で機能をどうするか話し合いをしているだろうけど、
pwfeedbackを必要だと提案した人、それぞ実装してやらかしちゃった人(提案した人かもしれないが)以外は誰も興味がなく
だからこそ誰もチェックをしなかったんじゃないの?といいたかったのです。
Re: (スコア:0)
たいした脆弱性ではないと強弁したいのでしょうが、Linux Mintで使われている機能を「どの層のためにあるんだ?」は通じませんね。
Re: (スコア:0)
実際Mintの開発チームはどうしているんだろう?
アップデートでデフォルト設定の変更は強制力が無いから
(たぶん設定ファイルを維持するか新しいバージョンにするか選択肢が出る)
問題が無いバージョンに差し替える必要があるはず。
上流にあたるUbuntuは、pwfeedbackをデフォで有効にしていないから
まだ1.8.26への差し替えは行われていないみたい。(18.04LTS)
個人的には、そういう上流との細かい差異が
混乱や見落としによるトラブル要因になるから
よりマイナーなMintやZorinなどを薦めたくない。
#「UbuntuやXubuntuは****って表示されないから嫌だ」って言う情弱のことは知らん
Re: (スコア:0)
パスワード入力時になにもエコーバックされないと、何回やってもパスワードが入力できないんですーって言ってくる人かな?
実際どうなんだろうね。パスワードが何文字入ったか分かるほうが一般的なのかな…
Re: (スコア:0)
> パスワード入力時になにもエコーバックされないと、何回やってもパスワードが入力できないんですーって言ってくる人かな?
誰が?
ついでにこの記事も関連に (スコア:1)
パスワードのマスキングは廃止すべき [srad.jp]
Re: (スコア:0)
コンソールの場合ガッツリログが残っちゃうことがあるので……
入力したことをフィードバックしつつもログに残さないってことならマスクにも一定の価値はある。
文字数の情報残るのも避けるなら完全不表示のが楽だけどね……
マスク出して文字数隠すならマスク文字を行いっぱい打ち出すとかしなきゃだし。
Re:コンソールの場合ガッツリログが残っちゃう (スコア:0)
>コンソールの場合ガッツリログが残っちゃう
そーなんですよねぇ
昔ユーザー名が大好きな人の名前
パスワードがやや卑猥
user:ohashilove
passwd:kunkakunka69!
ってなことがコンソールログに乗っかってて草生えたことがあります
doas (スコア:1)
Re: (スコア:0)
きっとインフィニティー!
Re: (スコア:0)
関連
https://opensource.srad.jp/story/15/10/21/0613243/ [opensource.srad.jp]
経緯など
https://gihyo.jp/admin/serial/01/bsd-yomoyama/0025 [gihyo.jp]
> doas(1)はパーサとヘッダを合わせてもソースコードが780行ほどしかありません。sudo(8)はCのコードとヘッダだけでも10,000行を超えていますので,sudo(8)と比較するとOpenBSD向けに必要な機能がだけが実装されたものであることがわかります。
(2015年10月23日掲載時、原文ママ)
UNIXのセキュリティ方式は変えたほうがいいのでは? (スコア:0)
UNIXは、suidのついた特殊なプログラムがセキュリティを担当するが、
セキュリティ担当を特権モード以上で動くカーネルデーモンとかに移行し、
APIやシステムコール経由でセキュリティ制御したほうがいいのでは?
Re: (スコア:0)
それを人は systemd と呼びます
Re: (スコア:0)
SELinuxがしっかり根付いていれば、ユーザに必要な権限だけを割り振ることでSUIDするプログラムは不要になる「はず」なのだが…だが…
suradoに権限昇格の脆弱性 (スコア:0)
かと思った。
ローマ字かよ! というツッコミは置いといて。
直ってんのか不安になる直し方 (スコア:0)
それ直したっていうコミット [www.sudo.ws]とその部分のソース [www.sudo.ws]見てみたんだけど、
一瞬直し損なったのかと空目するような直し方だった。
多分肝心なのは
だと思うので、
writeがコケる状態で文字を入れてはsudo_term_killを入力してleftとcpを乖離させる攻撃だったのかなと思うのだが、
write失敗でbreakしても入力ループ自体抜けてしまい問題の少なそうなsudo_term_eraseではbreakを消して、
問題の箇所ではwrite失敗を考慮しなければ無意味に見える処理の追加で対処している。
さらにコピペされているコードの片割れだけいじった事で不整合も起こしている。
とりあえずは良いとしてもこの調子で大丈夫なのかコレ……
Re: (スコア:0)
そうじゃないでしょ。
コピペ元(って便宜上呼ぶけど)のbreakは直近のwhile (cp > buf) の{}から抜けるために使ってるから、全く正しい。ところが、コピペ先の{}はwhileじゃなくてifだから、ここでbreakを呼ぶと大元のwhile(--left)から抜けてしまう。読み込んでないけど、修正された差分をみると、これは完全にやらかしてたってことだよ。コピペまでして対称的に書いてるつもりなのに全く違う動作になるから、気付いたら青ざめる系のうっかりだ。
#インクリメントの前置後置で笑ってしまう。
Re: (スコア:0)
しかしみじけ〜のにひで〜コードだな
cp > bufとかcp--一箇所にしろよと…
Re: (スコア:0)
簡潔に書こうとしてるから余計酷いって気もする。
Re: (スコア:0)
バッファ中の位置に関係する変数もleftとcpの二個あるしね。
特定条件でcp戻さずleftだけ戻してたからこれで死んだ臭い。
cp使いたい気持ちはわかるし一々cpとbufの差を計算したくないのも分かるんだけどねぇ……
c++のイテレータとかからすると予めbufendを計算するべきなんだけど、
cではあんま見ないよねそういう書き方。
Re: (スコア:0)
言語問わずこんな感じのありますね。
無論燃えた後か継続中かの違いしか無い…
ムダに状態持つな
→フラグ持つな
→→bool使うな()
なトコのコードもこんな感じだった…w
#一般常識と騙ってるのでたち悪かったな
Re: (スコア:0)
やっぱgotoって必要だよなーって思う。
どこからでも飛べてどこへでも飛べると複雑になりすぎるのでナウい言語(21世紀初頭くらい)の制限が必要だけども。
Re: (スコア:0)
使い手のスキル次第で猛毒になるだけですよねホント。。
そしてそんなのはコンパイラは弾けない…
#同一メソッド内コードクローンも弾けそうで弾けない…
Re: (スコア:0)
コピペコードは
sudo_term_killの所(便宜上A、脆弱性本体?)、
sudo_term_eraseの所(便宜上B)、
ループ後の所(便宜上C)、
で三ケ所あるけど、コピペ元はCっぽい気しない?
Cの箇所でだけ有効なエラー見てbreakをコピって生まれたバグや不整合に思える。
Aではポインタ戻し忘れてオーバーフロー、Bでは入力の中断が発生した。
ただBは他との比較ではおかしいけど、IOエラーで入力終了して既読分だけ処理ってままある処置かと。
writeエラー無視して処理続ける方針なら、全部writeエラー無視で良かった筈。
デクリメントの前置後置とか脆弱性とは無関係な修正も混ざってるから
パッチの意図がそもそもブレてんだよね。そのくせCはデクリメント変え忘れ。
コピペコードの一括修正で漏れとかデバッグ二次災害でありがちな光景だなと。
博士!これで須藤さんは大手をふって町に出れますね (スコア:0)
須藤さんはがんばらない。
須藤リカ (スコア:0)
sudo rm -rf / --rika
# 実行しないでください
Re: (スコア:0)
しかしなにもおきなかった
sudoは悪い文化 (スコア:0)
すべからく滅ぶべし
sudoを使う方がroot shellよりもセキュリティ的に安全
なんてドグマを信仰ている連中が未だに多数いる時点で
もはや害のほうが大きい
Re: (スコア:0)
どういう意味?