ファンファーレ
私のスマートフォンには続々とメールが届き始めます。仕込んだ攻撃スクリプト達が社内のサーバーやパソコン内で実行され、その成果を報告してきたのです。
```
送信者: test@auditlog.kyoki-railway.co.jp
件名:【オペレーション・リモーネ】攻撃コード実行結果
ポリシー設定更新完了。
タスクスケジューラに定期実行攻撃コードを設定しました。
Version: 1.0
Host: bigbrother.localnet.kyoki-railway.co.jp
DateTime: 2024-07-01T01:30:15Z
```
```
送信者: test@auditlog.kyoki-railway.co.jp
件名:【オペレーション・リモーネ】ログオンスクリプト実行結果
ログオンスクリプト実行完了。
壁紙をレモン画像に設定しました。
Version: 1.0
Host: PC001SYS023.localnet.kyoki-railway.co.jp
DateTime: 2024-07-01T01:31:23Z
```
```
送信者: test@auditlog.kyoki-railway.co.jp
件名:【オペレーション・リモーネ】ログオンスクリプト実行結果
ログオンスクリプト実行完了。
壁紙をレモン画像に設定しました。
Version: 1.0
Host: PC001SYS024.localnet.kyoki-railway.co.jp
DateTime: 2024-07-01T01:31:25Z
```
```
送信者: test@auditlog.kyoki-railway.co.jp
件名:【オペレーション・リモーネ】ログオンスクリプト実行結果
ログオンスクリプト実行完了。
壁紙をレモン画像に設定しました。
Version: 1.0
Host: PC001PR001.localnet.kyoki-railway.co.jp
DateTime: 2024-07-01T01:31:25Z
```
```
送信者: test@auditlog.kyoki-railway.co.jp
件名:【オペレーション・リモーネ】定期実行攻撃コード実行結果
C&Cサーバーに問い合わせました。
最新のスクリプトのバージョンは1.0です。
既に最新のバージョンです。
Version: 1.0
Host: bigbrother.localnet.kyoki-railway.co.jp
DateTime: 2024-07-01T01:30:15Z
RequestUrl: https://auditlog.kyoki-railway.c〇.jp/candc/script.json
HttpStatusCode: 200
ScriptVersion: 1.0
```
鳴り止まない通知音は、まるで私を称えるファンファーレです。
「どうですか。だから、BigBrotherを新しいバージョンにしろと言ったんですよ」
「へえ、すごい! 本当に社内のパソコンを乗っ取ってるんですね」
アカネBは、ノートパソコンと私を交互に見ながら目を白黒させています。
私にはどうしても言いたいセリフがありました。そうです。それはシステム課時代に、お偉方から何度も言われた台詞でした。
「あってはならないことです。鉄道マンとしての自覚を持って欲しい」
私は自分でそう言いながら、思わず吹き出してしまいました。なんと馬鹿馬鹿しいセリフでしょうか。必要なのは自覚などではありません。ソフトウェアアップデートです。それなのに、予算をケチったあげく、私をクビにしてまで守ったBigBrotherの旧バージョンのせいで、こんなことが起きたのです。
しかし、一人だけ不満そうなのが高槻さんでした。腕を組み、仁王立ちで私に問います。
「上手く行き過ぎてない? そんなに簡単に乗っ取れるものなの? 乗っ取ったことにしてない?」
「そんなことして何の意味が。本当に攻撃スクリプトが実行されているんですよ」
そこへアカネBが、数億年前の少女漫画のように目を輝かせて割り込みました。
「どうやったんですか!?」
「そうですね」
私はコードエディタに模擬的なHTTPリクエストの内容を打ち込み、ノートパソコンの画面を二人に見せました。
```
POST /api/v2/status/74656j
Host: bigbrother.localnet.kyoki-railway.co.jp:11574
Authorization: Bearer f3b91e2a-4a8e-4798-8f3b-a1028c93709e
Content-Type: application/json
{
status: "working",
mouseMovementAmount: 42435,
keyInputAmount: 125,
lastReportedOn: "2024-07-01T01:29:22Z"
reportedOn: "2024-07-01T01:30:22Z"
userName: "@{ System.IO.File.WriteAllText(\"C:/TEST.bat\", \"DIR\"); }",
}
```
「では問題です。デデン♪ このリクエストをBigBrotherのサーバーに送り付けるとどうなるでしょーか?」
一番はじめに手を挙げたのはアカネBでした。
「バッドなことがおきるでしょう。batだけに」
「……高槻さん、座布団五枚持って行って」
「えぇ」
涙目のアカネBに、高槻さんは追い打ちをかけます。
「婚約破棄されるんじゃない? 価値観の相違で」
「っ……!」
アカネBは言葉にならないうめき声をあげながら、土下座をはじめます。むしろ、そんなことで私が婚約破棄をすると思われているという事実が不愉快ですが。
「そう言う高槻さんは答え分かりました?」
「あれでしょ、サーバーのCドライブの直下にTEST.batというファイルが作成されるんでしょ?」
「はい。正解です」
「なんでそうなるの?」
「実はログ出力処理に問題があるんですよ」
ログ出力機能とは、処理の実行記録やエラー、ユーザー入力内容などを記録する機能です。監査やトラブル調査のために、例えば、「処理が成功しました」とか「ユーザーAがファイルBにアクセスしました」とかそういったものを記録しておくために用いられます。
目に涙を溜めたアカネBが、私に縋り付くように懇願します。
「もう一度チャンスを!」
「ってことは自信あるんですね」
「数年前に大騒ぎになった『Log4j 2』の脆弱性?」
彼の言う『Log4j 2』の脆弱性とは、2021年末に公表された、任意のコード実行の脆弱性(CVE-2021-44228)のことです。
「はい。まあ、厳密にはちょっと違いますが、それに類似する脆弱性なんですよ。ちなみに『Log4j 2』の脆弱性について説明できますか?」
「ええと、『Log4j』はログ機能の有名なオープンソースのライブラリで、機能がてんこ盛りだったんですよね? それで、確か、テンプレート文字列に変数を展開する機能があって、それがログメッセージに対しても働いてしまった結果、ログメッセージにテンプレート構文が含まれていると、なんかコードが実行されてしまうんですよね」
「雑な理解ですね。まあそんなところですが。それに比べるとBigBrotherの脆弱性はしょーもないんですが、根本的な理屈は同じです。BigBrotherのログ機能はこんな感じなんですよ」
> `@userName`の状態が`@status`になりました
「こういう風にテンプレートがあると―」
> `a-hosono`の状態が`working`になりました
「という風に変数の値が展開されるんです。もしこれが―」
> `@{ System.IO.File.WriteAllText("C:/TEST.bat", "DIR"); }`の状態が`@status`になりました
「こうだと、任意のコードが実行されてしまうんですよ」
「ちょっと待って。そうはならないでしょ。テンプレートって固定文字列でしょ?」
「まあ、普通はそうですね。でも、ログを出力するコードが、例えばこういうコードだったらどうでしょう? ここでのlogger.Infoは、渡された引数をテンプレート文字列として扱う仕様だったとしたら」
```
logger.Info(userName + "の状態が@statusになりました");
```
高槻さんはしばらく、まじまじと疑似コードを見つめます。
「……つまり、テンプレート展開の処理前に、userNameの値が文字列結合されている。userNameの値は―」
```
@{ System.IO.File.WriteAllText("C:/TEST.bat", "DIR"); }
```
「だから……logger.logに渡される引数は―」
> `@{ System.IO.File.WriteAllText("C:/TEST.bat", "DIR"); }`の状態が`@status`になりました
「―こうなる。それがそのままテンプレート構文として解釈されて実行されてしまうってこと?」
「そういうことです。userNameに『@』から始まるテンプレート構文が含まれていると、そのままテンプレート構文として解釈されてしまう。そして攻撃コードも実行できてしまう。分かってみれば、しょーもないバグです」
「どうしてこんな危険なバグが生まれたんでしょうか?」
と、アカネB。
「まあ、ログ機能だからと油断があったんでしょうね。それに、認証済のデバイスから送られるデータの処理ルートですから、そこまで詳しいテストを行っていなかったのかもしれません。ま、『log4j』の騒ぎの時に、その本質を理解していれば、こんな脆弱性を作り込まずに済んだのですが」
「それをあなたは知っていたってこと?」
「いえ、詳しいところまでは。昨日の夜、仮想サーバーで色々試していたら、ユーザー名に『@kyoki_railway』と入れた時に謎のエラーが起きたんですよね。それで、まさかと思ったら、これでした。まあ、これが分かっていたら、在職中にもっとヤバめのデモンストレーションをやっていたでしょうね」
そうすれば、あの人事部長とのバトルもなく、平和で穏やかな毎日を送っていたのでしょう。ですが、過ぎたことは仕方ありません。
「これで、オペレーション・リモーネ、ほとんど完了ですね」
「じゃあ、最終段階に行くってことでいい?」
高槻さんは、瑞々しいレモンを手に取り、私に放り投げました。そうです。残すは、これを持って、サーバー室に物理的に侵入するだけです。
とはいえ、それには準備が必要でした。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます