レッスン 3-3

1 つのアカウントから、どこまで行けるか。

目安 60 分 トラック 3 攻撃と検証の 3 本目

読み終えたら手元の VM で昇格の経路を 1 つ見つけて塞げる

この頁の流れ

  1. 1なぜ上がれるのか
  2. 2脆いコードと直したコード
  3. 3ログでの見え方と検知
  4. 4直し方と確かめ方
  5. 5関わる事例
  6. 6確認クイズ
  7. 7説明課題
  8. 8一次資料
  9. 9次へ

侵入の 1 歩目は、ふつう低い権限のアカウントです。そこから管理者へ上がれるかで、被害の大きさが決まります。手元の VM で、要らない SUID、広すぎる sudo の設定、過剰な権限のコンテナという昇格の経路を 1 つ見つけて塞ぎ、戻らないように試験で固めるところまでを扱います。

出典を確かめた日 2026年10月27日

なぜ上がれるのか

攻め手がまず手にするのは、たいてい低い権限のアカウントです。フィッシングで奪った一般利用者、委託先の限られた口座。そこから管理者へ上がれれば、同じ機械のすべてに手が届きます。MITRE の ATT&CK は、この「より高い権限を得る」段階を権限昇格として、使われる技法をまとめています。

上がれてしまう原因は、たいてい平時の設定にあります。要らないのに付いたままの特権、「とりあえず全部許す」になった管理の設定、強すぎる権限で動くコンテナ。どれも、置いた時には理由があっても、見直されずに残ります。

縦と横

権限昇格には向きがあります。縦は、一般利用者から管理者へと、より高い権限へ上がることです。横は、同じ権限のまま、別の利用者のデータや口座へ移ることです。このレッスンは主に縦を、手元の VM で扱います。

よく残る弱い設定

上がる足場になりやすいのは、次の 3 つです。要らないのに特権の印 (SUID) が付いた実行ファイル。管理者の操作を「どの命令でも」許してしまう sudo の設定。root のまま、要らない権限まで持って動くコンテナ。どれも、要る分だけに絞れば足場が消えます。

脆いコードと直したコード

ラボの中の小さな関数で比べます。Python に付いている物だけで動き、実際に権限を変えるのではなく、許すかどうかの判断だけを見ます。

管理者なら何でも通すか、命令を絞るか

脆いコード 管理者なら何でも通す

Python

ADMINS = {"ops"}

def may_run(user, cmd):
    return user in ADMINS
直したコード 許した命令だけ通す

Python

ALLOWED = {"ops": {"systemctl restart web"}}

def may_run(user, cmd):
    return cmd in ALLOWED.get(user, set())

脆い方は、ops に入った誰かが、どんな命令でも管理者として実行できます。パスワードを再利用する命令や、設定を書き換える命令も通ります。直した方は、利用者ごとに許した命令の一覧だけを通します。sudo の設定でいえば、ALL を許すのではなく、要る命令だけを並べる形です。

使い終えても特権のままか、下げるか

脆いコード 特権の作業のあとも特権のまま

Python

def handle(req):
    do_privileged_setup()
    serve(req)  # ここも特権のまま
直したコード 特権の作業を終えたら下げる

Python

def handle(req, drop):
    do_privileged_setup()
    drop()  # 一般利用者の権限へ落とす
    serve(req)

脆い方は、最初の準備で要った特権を、そのあとの処理でも持ち続けます。利用者の要求を扱う所に穴があれば、その穴が特権のまま突かれます。直した方は、特権の要る作業を終えたら権限を落とし、残りは一般の権限で動きます。足場になる時間を短くする考え方です。

ログでの見え方と検知

守る側は、昇格の足場が増えていないか、足場が使われていないかを見張ります。見るのは、次の 3 つです。

見る物なぜ効くか
新しく現れた SUID の実行ファイル要らない特権の印が、いつの間にか増えていないか
許可の一覧に無い sudo の実行絞った範囲の外が使われたら、設定か侵入を疑う
想定外の管理者権限のプロセス一般の処理が管理者で動いていれば、足場の疑い

足場は、使われる前に消すのが一番です。定期に SUID の一覧を取り、sudo の設定を見直せば、攻め手が同じ足場を探しても、そこにはもう特権がありません。

直し方と、直ったことの確かめ方

自分の VM の中だけで行います。他人の機械や、共有のサーバーには向けません。

  1. 自分の VM で find / -perm -4000 -type f 2>/dev/null を回し、SUID の付いた実行ファイルを一覧にする
  2. 一覧の各ファイルについて、本当に特権が要るかを確かめる。自分で付けた要らない物は chmod u-s <ファイル> で印を外す
  3. sudo -l と /etc/sudoers、/etc/sudoers.d を見て、ALL=(ALL) NOPASSWD: ALL のような広い許可を探す
  4. 広い許可は、sudoers の Cmnd_Alias で、要る命令だけの一覧に絞る
  5. コンテナは、root で動かさず、要らない権限を落とし、特権付きの起動 (--privileged) を外す
  6. 下の試験を足し、許可の一覧を広げると試験が落ちることを確かめる
  7. 終わったら、VM のスナップショットを戻すか、作った物を消す
許可の外が通らないことを固める試験

Python

def test_denies_outside_allowlist():
    assert not may_run("ops", "rm -rf /")

def test_unknown_user_runs_nothing():
    assert not may_run("guest", "systemctl restart web")

試験は「許した命令だけが通り、一覧に無い利用者は何も通せない」ことを固定します。あとで誰かが ALL を足して戻しても、ここで止まります。

関わる事例

大阪急性期・総合医療センターでは、給食の委託事業者の保守用 VPN から侵入され、共通のパスワードで病院のサーバーを乗っ取られました。院内では全ユーザーに管理者権限を与え、Windows のパスワードもサーバーと端末で共通でした。低い足場から管理者へ、設定のままで上がれた例です。

アサヒグループでは、管理者権限を奪われたことで侵入に気づけず、受注と出荷、相談の窓口が止まりました。Marriott では、買収した Starwood のネットワークへの侵入を 4 年間検知できず、その間に権限を広げられていました。どれも、権限を要る分だけに絞り、足場を定期に消していれば、上がれる範囲を狭められたはずの場面です。

確認クイズ

1 問目

委託先の保守のために、ALL=(ALL) NOPASSWD: ALL で何でも sudo できるようにしています。どう見直しますか。

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。

2 問目

自分の VM で、要らない特権の足場を探したい。最初にすることはどれですか。

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。

説明課題

次のことを、自分の言葉で 3 行にまとめてください。書けたら、このレッスンは修了です。

  • 手元の VM で見つけた昇格の経路を 1 つ挙げ、どう塞ぐか
模範解答を見る

自分の VM で find / -perm -4000 を回すと、要らない SUID の付いた実行ファイルが見つかった。特権が要らないので chmod u-s で印を外した。あわせて sudo の設定が何でも許す形だったので、Cmnd_Alias で要る命令だけに絞り、許可の外が通らないことを試験で固めた。

一次資料

どれも 2026年10月27日に開いて、題と中身を確かめました。

次へ

次のレッスンは「横への広がりと認証情報」です。上げた権限を足場に、別のホストへどう広がるのか、使い回しをどう止めるのかを扱います。

次のレッスン 3-4 横への広がりと認証情報

このレッスンにつながる物

トラック 3 攻撃と検証の中で

前のレッスン 3-2 再現と影響の示し方

学んだことを次につなげる

ゆめさくセキュリティは、攻撃の仕組みを知り、自分の PC の中で壊して直し、守る側の判断を身につけるための学びの場です。

ラボはすべて自分の PC の中 (127.0.0.1) で閉じます。自分が管理していない相手に試すことは扱いません。