第30話 インジェクション・アタック
異変は、翌日の昼に始まった。
大公宮の壁面に刻まれた文字列が——書き換わっていく。
最初に気づいたのはシェルだった。アーカイブスの中央図書塔で記録を調べていたシェルから、緊急の連絡が入った。
「中央データベースが攻撃を受けています。直ちに来てください」
俺たちが図書塔に駆けつけた時、壁面のコードは既に赤く染まっていた。
[ALERT] INJECTION ATTACK DETECTED
Target: Central Archive Database
Type: SQL Injection - Code injection via external query
Status: ACTIVE - Records being modified
Affected records: 2,841 and counting
「SQLインジェクション——外部からのコード注入だ」
俺はデバッガーズ・アイで攻撃の全容を読み取った。
中央データベースに対して、外部から悪意あるクエリが大量に送り込まれている。正規のデータ操作に見せかけた改竄コード——入力値のサニタイズ(無害化処理)が不十分な箇所を突いた、古典的だが強力な攻撃手法だ。
「何が書き換えられている?」アリアが訊いた。
俺はコードを追った。改竄されているのは——歴史記録だった。
「過去の記録が書き換えられていく。特に——『英雄の伝承』に関する記述が、消されている」
シェルが顔色を変えた。
「誰かが——過去を消そうとしている」
「ヴァイラスだ」俺は断言した。「コードスタイルが一致する。ヴァイラスが自分の過去に関する記録を——消しにかかっている」
中央図書塔の最深部。データベースのコア区画。
壁面全体がコードで覆われた巨大な空間だった。天井まで届く棚に、無数の記録石が並んでいる。記録石の一つ一つが、データベースの「レコード」——歴史の一片だ。
その記録石が、次々と色を変えていた。青く安定していた光が、赤い点滅に変わっていく。改竄が進行している証だ。
「まずい——改竄速度が上がっている」
俺はデバッガーズ・アイで攻撃コードのパターンを分析した。
注入されているクエリは——巧妙だった。
UPDATE world_history
SET hero_record = NULL,
hero_name = '[DELETED]',
hero_achievement = '[DELETED]'
WHERE era = 'version_0.x'
AND record_type = 'hero_chronicle';
-- Injected via unsanitized input at archive_gate_7
歴史テーブルの英雄関連レコードを、片っ端からNULLに書き換えている。名前を「墨消し」に、功績を「データ抹消」に。
「これを止めないと、英雄に関する記録が全て消える」
「マスター」メモリが言った。「攻撃の入口を特定しました。アーカイブ・ゲート7番——外部からの問い合わせを受け付ける窓口の一つです。入力チェックが甘い箇所があります」
「ゲートを閉じれば止まる?」
「一時的には。でも攻撃者は別のゲートから再侵入する可能性があります」
「根本的には、全ゲートの入力チェックを強化する必要がある」
俺が考えている間に、シェルが動いた。
シェルが手帳を閉じ——手を前に伸ばした。
その手から、淡い青い光が放たれた。
クエリ魔法。シェルの固有能力。情報の検索・取得・操作に特化した魔法体系。
だが今のシェルは——検索ではなく、防衛に使っていた。
「何をしている」俺が訊いた。
「SQLを以てSQLを制す」
シェルの声は静かだった。だが——いつもと違った。感情が乗っていた。
シェルが展開したのは、カウンタークエリだった。攻撃者と同じSQL言語で、防御用のクエリを構築している。
-- COUNTERMEASURE: Isolate injected records
BEGIN TRANSACTION;
SELECT FROM world_history
WHERE modified_by = 'EXTERNAL_INJECTION'
AND modified_timestamp > '2024-01-01';
-- Tag and quarantine
UPDATE world_history
SET quarantine_flag = TRUE
WHERE modified_by = 'EXTERNAL_INJECTION';
COMMIT;
注入されたコードを一行ずつ検出し、隔離フラグを立てている。改竄されたレコードを「隔離」して、それ以上の伝播を防ぐ。
「シェル——」
俺は見ていた。シェルの手が——震えていた。
いや、震えではない。力が入りすぎている。手が白くなるほど、拳を握っている。
「データは死なない」
シェルが呟いた。
声が——いつものクールなトーンから、外れていた。
「消えさせない」
感情だった。間違いなく——怒りだった。
シェルは「感情はノイズだ」と言ってきた。データの正確な記述と分析こそが価値だと信じてきた。だが今——記録が消されていくことに、シェルは怒っている。
「お前、今、本気で怒ってるな」
俺が言った。
シェルは答えなかった。黙ってカウンタークエリの構築を続けた。
それが答えだった。
しかし攻撃の規模は、シェル一人の手に余った。
カウンタークエリの速度と、注入コードの速度が拮抗している。シェルが一つ隔離するごとに、新しい注入が二つ入ってくる。
「追いつかない——」シェルが歯を食いしばった。
「俺が入る」
俺はデバッガーズ・アイを全開にした。
攻撃コードのパターンを読み、改竄されたレコードの源コードを直接修正していく。NULLに書き換えられた値を、バックアップログから復元する。
「ガルド!」
「おう!」
「物理的にゲートを守れ! 攻撃コードが物質化する可能性がある!」
「任せろ!」
ガルドが図書塔の通路に立ちはだかった。重い足音が床を震わせる。
案の定——注入コードの一部が実体化し始めた。文字列が凝固して、蛇のような形状のコード生物になる。細長い体に、コードが蠢いている。
ガルドの拳がそれを叩き潰した。
「アリア! 記録石を物理的に防御してくれ! 改竄される前に——」
「わかりました!」
アリアが条件分岐剣法を展開した。改竄コードが記録石に触れようとするたびに、剣の一閃が割り込む。「IF 外部コードが記録石に接触 THEN 斬撃で阻止」——そのアルゴリズムを、剣で実行している。
メモリが叫んだ。
「マスター! 古代のバックアップ・プロトコルを発見しました! 発動できます!」
「やれ!」
メモリの全身の回路模様が光った。
ナビゲーター・プログラムとしての権限が発動する。重要データを退避用の保護領域にコピーする——古代のバックアップ機能。
[BACKUP PROTOCOL ACTIVATED]
Navigator Program: MEMORY
Authorization Level: Legacy Admin (Partial)
Backing up critical records...
Progress: 12% ... 34% ... 51% ...
データが次々と保護領域に退避されていく。
俺とシェルが改竄を食い止め、ガルドとアリアが物理的に防衛し、メモリがバックアップを走らせる。
五人の連携が——初めて、完全に噛み合った。
攻撃が止まったのは、三十分後だった。
唐突に——注入コードの流入が停止した。
ヴァイラスが手を引いたのか、それとも別の理由か。
俺たちは息を切らしていた。シェルが壁にもたれかかり、ガルドが汗を拭い、アリアが剣を鞘に収め、メモリが俺の隣にへたり込んだ。
「被害状況」俺が訊いた。
シェルが手帳を確認した。
「改竄されたレコード——四千二百件。うち、隔離できたもの——三千八百件。復旧不能——四百件前後。メモリのバックアップで重要データの大半は保護できましたが……一部の古代記録が永久に失われました」
「四百件……」
大公が現れた。老人の顔は蒼白だった。
「古代記録の中に——英雄の詳細な伝承があったはずだ。名前、出自、戦いの記録——それが」
「消されました」シェルが言った。「ヴァイラスの狙いは、まさにそこでした」
大公が拳を握り締めた。老いた手が白くなった。
「数百年分の記録が——一日で」
「大公」俺が言った。「残っているデータを守ります。全ゲートの入力チェックを強化しましょう。二度目の攻撃に備えて」
大公が頷いた。深い疲弊と、それでも折れない意志が、その目にあった。
攻撃の終わった中央図書塔で、俺はようやく息をついた。
終わった——そう思った。防衛は成功した。被害はあったが、最悪は免れた。
シェルが隔離データの整理を始めた。後処理だ。地味だが大事な工程。俺は壁にもたれかかり、目を閉じかけた。
「……桐島」
シェルの声のトーンが変わっていた。
俺は目を開けた。
「攻撃コードの残骸に——攻撃とは無関係な情報が混じっています」
「無関係?」
「攻撃コードのヘッダに、送信元のアドレスが暗号化されて埋め込まれていました。復号すると——座標が出ます」
嫌な予感がした。
「攻撃の発信源——ヴァイラスの『端末』がこの近くにいます」
俺は窓の外を見た。
空に源コードの断片が漂うアーカイブスの街並み。その向こう——南東の方角に、微かなノイズが走っている。
デバッガーズ・アイが捉えたのは、小さな、しかし確実な歪み。
終わっていなかった。
データの改竄はフェーズ1に過ぎない。
「来るぞ」
俺が立ち上がった瞬間——図書塔の壁が震えた。
フェーズ2——物理的な侵攻が、始まろうとしていた。
次回、第31話「フォークボム」——自己複製する端末プログラム。倒しても倒しても増殖する敵に、蓮はどう立ち向かうか。




