認証トークンの導入から五日後。攻撃者は沈黙していた。
「静かすぎますね」
エルナが監視結晶石を眺めながら呟いた。
「嵐の前の静けさ、ってやつですか」
ミーナが帳簿に数字を書き込みながら言った。工房の日常業務は続いている。王都の定期メンテ、各区画の巡回点検、手順書の更新、やることは山積みだ。
「たぶん、次の手を考えてるんでしょう」
リオンは資料を整理しながら答えた。
「なりすまし攻撃が防がれたことは向こうも気づいている。次はもっと巧妙な」
その瞬間、監視結晶石の一つが激しく点滅した。
「第七区画、異常検知!」
リオンが立ち上がる。エルナがすぐに通信魔法陣に手をかけた。
「何が起きてます!?」
「農地魔法陣が、暴走してます! 土壌の魔力が異常上昇、作物が枯れ始めて」
通信の向こうから、悲鳴が聞こえた。
「すぐに行きます!」
第七区画の農地に到着したとき、光景は悲惨だった。
畑一面の作物が、黒く変色して枯れている。土壌からは異常な魔力が噴き出し、空気が歪んで見えるほどだ。農民たちは遠巻きに畑を囲み、呆然と立ち尽くしている。
「これは……」
エルナが息を呑んだ。
リオンは農地魔法陣の中心に駆け寄り、【診断】を発動した。
魔力の流れが——おかしい。入力パスから異常な魔力パターンが流れ込み、本来の土壌調整術式を書き換えている。
「これ、インジェクションです」
「インジェクション……?」
「魔法陣の入力パスに、不正な術式を注入されてます。SQLインジェクションと同じ——入力値として送られた命令が、そのまま実行されている」
アルヴィスが駆けつけた。
「何が起きている」
「魔法陣への攻撃です。入力パスから不正術式を注入されて、暴走しています」
「止められるのか」
「今すぐ魔力供給を遮断してください!」
アルヴィスが手をかざし、農地魔法陣への魔力供給を強制的に切断した。魔法陣が停止し、土壌からの魔力噴出が収まる。
静寂が戻った。
だが、畑は——もう手遅れだった。一面の作物が枯れ、土壌は汚染されている。
「今年の収穫が……」
農民の一人が膝をついた。
リオンは農地魔法陣の刻印を【診断】で詳細に調べた。
「入力パスに、不正な術式が埋め込まれています。これは」
「外部から送り込まれたのか」
「そうです。農地魔法陣には『土壌の状態を外部から入力して調整する』機能があります。本来は魔術師が定期的に土壌データを入力して、最適な魔力配分を調整するためのものですが」
リオンは刻印の一部を指差した。
「入力値の検証が甘いんです。『これは土壌データだ』と信じて、そのまま魔力パターンとして受け入れている。だから、不正な術式を『土壌データのふり』をして送り込めば」
「実行されてしまう、ということか」
「その通りです」
エルナが震える声で言った。
「じゃあ、他の農地魔法陣も……」
「危険です。同じ脆弱性を持っているはずです」
アルヴィスの顔が険しくなった。
「王都には農地魔法陣が十二ヶ所ある。すべてが狙われる可能性があるということか」
「はい。それに、」
リオンは地図を広げた。
「農地だけじゃありません。水浄化魔法陣、灯火魔法陣、通信魔法陣——外部入力を受け付けるすべての魔法陣が、理論上は攻撃対象です」
「……全部か」
「全部です」
工房に戻り、緊急会議が開かれた。カティアも駆けつけた。
「第七区画の被害状況は?」
「今年の収穫は全滅です。土壌の浄化には最低でも半年かかります」
カティアの表情が曇った。
「民への補償が必要ですね……」
「殿下」
リオンが資料を広げた。
「問題は補償だけではありません。この攻撃が他の区画にも波及すれば、王都の食料供給が破綻します」
「対策は?」
「入力値の検証機構——サニタイズ層を、すべての魔法陣に実装します」
「さにたいず……?」
「『浄化』です。外部から入力された魔力パターンを、実行前に検証する。正常なデータ形式か、不正な術式が含まれていないか、厳密にチェックします。不正と判断されたものは、実行前に弾く」
エルナが図を見ながら言った。
「つまり、入ってくるものを全部疑うんですね」
「その通り。ユーザー入力は常に悪意があると想定しろ——セキュリティの鉄則です」
カティアが頷いた。
「分かりました。必要な人員と予算は確保します。——どれくらいで実装できますか?」
「設計に二日。王都全域への展開に一週間」
「早く」
「これ以上は無理です。手順を省略すれば、別の障害を引き起こします」
カティアはリオンを見た。その眼には焦りと、同時に——信頼があった。
「分かりました。では、その計画で進めてください」
リオンは二日間、ほとんど眠らずに設計を続けた。
サニタイズ層の設計は、慎重に慎重を重ねる必要がある。厳しすぎれば正常な入力まで弾いてしまい、緩すぎれば不正術式を通してしまう。
「リオンさん、また寝てないでしょう」
エルナが差し入れを持ってきた。
「あと少しで設計が終わります」
「それ、昨日も聞きました」
「……すみません」
エルナは溜息をついて、リオンの隣に座った。
「手伝います。何をすればいいですか」
「テストケースの作成を手伝ってください。正常な入力パターンと、異常な入力パターンのサンプルを用意して、サニタイズ層が正しく判定できるか検証します」
「分かりました」
二人は並んで作業を続けた。
深夜。ミーナが毛布を持ってきた。
「二人とも、徹夜はダメですよ」
「でも」
「分かってます。だから、せめて毛布を」
ミーナが二人の肩に毛布をかける。その優しさに、リオンは少しだけ罪悪感を覚えた。
「……ありがとう、ミーナ」
「お礼はいいから、終わったらちゃんと寝てくださいね」
二日後、サニタイズ層の設計が完成した。
リオンはアルヴィスに設計書を渡した。
「入力値の魔力パターンを三段階で検証します。第一段階は形式チェック——データ形式が正しいか。第二段階は範囲チェック——魔力の出力値が想定範囲内か。第三段階は術式チェック——実行命令が含まれていないか」
「三段階……面倒だな」
「面倒です。でも、これをやらないと——また暴走します」
アルヴィスは設計書を読み込んだ。やがて、小さく頷いた。
「……悔しいが、理に適っている。これで進めろ」
「ありがとうございます」
「だが、実装は私も手伝う」
「え?」
「お前一人では一週間かかると言っただろう。私が加われば——五日で終わる」
リオンは一瞬、言葉を失った。
アルヴィスが——協力してくれる。あれほど「我々のやり方に口を出すな」と言っていた局長が、今は自ら手を動かそうとしている。
「……お願いします」
王都全域へのサニタイズ層展開が始まった。
リオン、エルナ、アルヴィス、そして魔術局の技師たちが総動員され、各区画の魔法陣に浄化フィルタを実装していく。
農地魔法陣から始まり、水浄化、灯火、通信。すべての外部入力を持つ魔法陣に、一つ一つサニタイズ層を追加していく。
「第三区画、完了しました!」
「第五区画、テスト成功!」
報告が次々と上がる。
リオンは各区画を巡回し、実装を確認していく。【診断】で魔法陣を見ると、新しく追加されたサニタイズ層が正しく動作しているのが分かる。
「よし、これで入力パスからのインジェクション攻撃は防げます」
「本当に大丈夫か?」
「完璧ではありません。でも、少なくとも今回と同じ攻撃は防げます」
エルナが疲れた顔で笑った。
「リオンさんらしい答えですね」
「完璧なセキュリティなんて存在しませんから」
五日目の夕暮れ。
最後の区画——第十二区画の農地魔法陣へのサニタイズ層実装が完了した。
「全区画、展開完了!」
報告を受けて、リオンは深く息を吐いた。
「……終わった」
「お疲れ様です、リオンさん」
エルナが肩を叩いた。アルヴィスも、珍しく疲れた顔で椅子に座っている。
「これで、また一つ——攻撃を防げるようになった」
「ああ。だが」
アルヴィスが窓の外を見た。
「相手は必ず次の手を打ってくる」
「……はい」
リオンは監視結晶石を見上げた。すべて正常に明滅している。
だが、この静けさが。いつまで続くのか。
「次は何を仕掛けてくるか……」
リオンは手順書を開いた。サニタイズ層の運用手順、障害時の切り戻し手順、定期点検の項目。すべてを記録する。
次の攻撃に備えて。
この戦いは——まだ終わらない。
【あとがき】
第40話「入力経路から注入されてる」でした。インジェクション攻撃との戦い。入力値を信用しない、というセキュリティの鉄則が異世界でも活きます。