第22話 漏れた設計
どこから漏れたかを調べるとき、最後まで容疑者から外すのは、たいてい自分だ。
今日は、その椅子に、最初に自分を座らせた。
机の上に、白い点はもう出ない。代わりに、画面の中を収集の脈が流れている。六分、八分、また六分。規則正しくないことだけが、規則正しい。
聞き耳は、昨日の夜から鳴りっぱなしだった。
その脈の一件を、俺は拡大した。
来ていない人間の、出勤打刻。同じ操作が二度来て、記録は一回。二度目が、静かに落ちている。
その畳み方に、覚えがあった。見るたびに、見なかったことにしたくなる。
同じ識別子の二度目を、黙って捨てる。俺が、自分の道具のために組んだ癖だ。
operation_id。
「MICA」
「はい」
「昨日、俺はこれを見て、信じたくないと思った」
「記録にあります」
「今日は、信じる前に調べる。順番が、逆だった」
他人の現場なら、こうはしない。容疑者を全部並べて、上から潰す。感情で容疑者を選ばない。自分のときだけ、その手順を飛ばしていた。
「容疑を全部出せ。俺が、どこから漏らしたか」
画面に、三行が並んだ。作業環境のログ。外との通信。納品物。
「手が触れた経路は、この三つです」
「上から潰す」
最強のデバッガーが、調べる側ではなく、調べられる側に座る。妙な気分だった。容疑者の顔は、よく知っている。毎朝、鏡で見ている。
——
一つ目。作業環境のログ。
俺の机は、外につながっていない。検証は遮断した環境でやる。MICA の権限も、昨日、調査に要る範囲しか開けていない。本番にも、外部サービスにも、手は届かない。
「ローカルから、operation_id を含む実行記録を全部出せ。発行時刻と、出力先も」
リストが流れた。どれも一時ディレクトリ。どれも、外へ出ていない。
「外向きの書き込みは」
「ありません。出力先は、全件ローカルです」
一つ目、シロ。だが、安堵はしなかった。シロを出すのは簡単だ。難しいのは、見落としを探すほうだ。
「二つ目。通信ログ。期間は、道具を作り始めてから今まで」
MICA が相関を組む。宛先、時刻、データ量。並べているうちに、一件、目に留まった。
深夜の、外への送信。
俺は、身を乗り出した。三時台。まとまった量。宛先は、外部。漏洩なら、ここだ。
指が、勝手に方眼紙の縁を叩いていた。
「宛先を解決しろ。中身の種別も」
「解決中」
数秒。
「あなた名義の退避先です。送信時刻は、自動退避の予定と一致します」
「……俺の、退避か」
「中身は、暗号化済みの差分。第三者には読めません」
俺は、息を吐いた。
色めき立った分だけ、間抜けだった。深夜の外部送信は、自分が自分のために組んだ退避だった。漏洩じゃない。空振りだ。
「初見で当てるな、だな」
「あなたが、よく言います」
引っかかったことより、引っかかりかけて喜んだ自分が、気になった。早く犯人を、自分の外に置きたい。その気持ちが、目を鈍らせる。
二つ目も、シロ。ローカルも通信も、漏洩を再現できない。容疑者が、二人消えた。
——
残るは、納品物。
だが、その前に、確かめたいことがあった。
「MICA。実験に付き合え」
「内容を」
「コードを一つ読ませる。書き手は伏せる。どこの誰が書いたか分からない、拾い物として読め」
「了解しました」
俺は、自分が昔書いた検証コードを一つ選んだ。名前も日付も剥がして、誰のものか分からない状態にして、渡す。二重実行を一回に畳む、あの処理が入っている。
「読みました」
「書き手について、言えることは。名前は要らない。手つきだけでいい」
少し置いて、MICA が答えた。
「同じ書き手の手です」
「同じ、とは」
「畳み方が一致します。識別子の発行単位、時間窓、二度目を捨てる順序」
「収集の脈と、か」
「はい。三つとも、同型です」
画面が、二つに割れた。
左に、収集の脈。右に、名前を剥がした俺の昔のコード。MICA が、二つの重複排除の形を重ねる。
発行のタイミング。捨てる順番。残す一回。
線が、綺麗に重なった。
誰の名前も使わず、設計の癖だけで、書き手が指される。
——あれは、誇りだった。
あの夜、空中の Enter が二度効いて、俺は二重実行を一つに畳んだ。同じ番号の二度目を、静かに捨てる。無駄のない解き方だと思った。自分の手際に、少しだけ満足した。
その綺麗さが、今は俺の輪郭を、外に残していた。
直したくて書いたコードが、俺を名指ししている。
「指紋だな」
「はい」
「綺麗に書くほど、くっきり残る」
「設計の癖は、識別子になります」
軽口じゃなかった。事実だった。事実のほうが、効いた。
——
夕方、莉央さんに電話を入れた。
調査の一環だ。どこから漏れたか、報告する責任がある。昨日引いた線を、初めて実地で使う。
「相馬さん。何か、分かったんですか」
「漏洩経路を、半分まで絞った。先に、報告書に書けることから話す」
「お願いします」
「うちの納品物の作り方に、外から癖を読まれる隙があった。これは再現できる事実だから、書く。今後は、渡す前に書き手の癖を落とす。その手順も書く」
「癖、というのは」
「同じ人間が書くと、コードの畳み方が揃う。それを外から見ると、書き手が分かる。指紋みたいなものだ」
電話の向こうで、ペンの音がした。会社のシステムじゃなく、たぶん紙のほうだ。
「書けないことも、ありますよね」
「ある。誰がそれを読んで、何に使ったか。証拠がない。だから報告書には書かない。今、口頭で言ってる。犯人は、まだ分からない」
「分かりました」
莉央さんは、そこで黙らなかった。
「それ、塞げるんですか」
来た、と思った。莉央さんは、怖がる前に確かめにくる。
「ミスなら塞げる。書き間違いや設定の漏れなら、直せる。だが、これはミスじゃない。正しく書いたコードに開いた穴だ。正しさに開いた穴は、塞ぎ方が、まだ分からない」
「分からない、で、私は何を聞けばいいんですか」
順番を飛ばさない人だ。
「次に渡すときは、指紋を落としてからにする。それは約束する。だが、今ある納品物は、もう先方の手元にある。そこから先は、俺の手が届かない。届かないってことだけは、正直に言っておく」
短い沈黙。
「報告書には、どこまで書けますか」
「絞った経路と、今後の手順まで。読み取られた事実は書く。読んだ相手は、書かない」
「……分かりました。その線で、社内に上げます」
書ける紙と、書けない口頭。二つは、混ざらずに動いた。線を引いた意味は、あった。
——
電話を切って、机に戻った。
ローカルは、シロ。通信も、シロ。自分の管理下のログからは、漏洩を再現できない。
それでも、収集の脈には、俺の畳み方が出ている。
手の中で再現できないのに、外には出ている。
つまり、漏れたものは、もう俺の手の中にない。
「MICA。納品物の一覧を出せ。表示ズレの修正で、NEXTPULSE に渡したもの全部」
リストが出た。修正パッチ。手順書。そして——検証データ。
再現コードと、テストの記録。
俺は、その一件を開いた。
開いて、止まった。
検証データの中に、二重実行を抑える処理が、動く状態のまま入っていた。
動く状態のまま——つまり、俺の組み方のまま。畳み方も、捨てる順番も、あの夜の設計のままだ。検収を通すために、いちばん綺麗に書いた部分だった。
そのいちばん綺麗な部分に、俺の指紋が、くっきり残っている。
「これは、もう先方の管理下です」MICA が、静かに言った。「納品済み。あなたの手は、届きません」
「……だな」
俺の外に、容疑者が一人だけ残った。盗まれたのでも、ミスでもない。仕事として正しく渡したものの中に、俺が映っていた。
画面の隅で、収集の脈が、不規則なまま鳴り続けている。
六分。八分。また六分。
開いたままの検証データを、もう一度見た。
「明日、これを読み直す」
「どう読みますか」
「向こうの席から読む。俺がどこで見えてたのか、相手の目で確かめる」
塞ぎ方は、まだ分からない。だが、どこに穴が開いているかは、もう分かっている。
俺が、いちばん誇った場所だ。
■ 技術メモ
【自己監査(容疑者を並べる)】
何かが漏れた、壊れた、というとき、原因を探す近道は、思い当たる経路を一度すべて並べ、上から一つずつ潰していくことです。
このとき難しいのは、自分を容疑者から外さないことです。人はつい、原因を自分の外に置きたがります。早く「自分のせいではない」と確かめたくなり、その気持ちが目を曇らせます。外部の事故を調べるときと同じ手つきで、自分の環境も同じように疑う。作中で透が、最初に自分を被疑者の椅子に座らせたのは、この切り分けです。
【ログ相関と切り分け】
別々に取られた記録を、時刻や宛先で突き合わせ、同じ出来事を指しているかを調べることをログ相関と呼びます。
「外への送信があった」という一行だけでは、それが漏洩なのか正規の処理なのかは分かりません。宛先を解決し、時刻を予定と突き合わせて初めて、「これは自分の退避だった」と除外できます。怪しい一件に飛びつかず、別の記録で裏を取ってから消す。この地味な突き合わせが、思い込みによる誤検知を防ぎます。作中の深夜の送信は、この手順で空振りと分かりました。
【コードの癖は書き手を指す】
プログラムには、書いた人の癖が出ます。名前の付け方、処理の畳み方、例外をどう捨てるか。同じ人が書いたコードは、こうした細部が揃いやすく、名前を消しても「同じ書き手らしい」と推定できることがあります。
これは現実のソフトウェアでも起きることで、丁寧に整った設計ほど癖が一貫し、かえって書き手を特定しやすくします。便利さや美しさのために磨いた部分が、外から見れば個人を見分ける手がかりになる。直すために書いたものが、自分の輪郭を残してしまう、という反転です。
【報告境界を実地で使う】
何を文書に書き、何を口頭に留めるかを、あらかじめ決めておく取り決めを、作中では報告境界と呼んでいます。
今回はそれを、初めて実際の報告で使っています。「外から癖を読まれる隙があった」という再現できる事実は文書に書き、「誰が読んで何に使ったか」という証拠のない部分は口頭に回す。受け取る側は、確かなことと推測とを分けて扱えます。報告境界は、相手が次に何を確かめればよいかを問い返せるときに、初めて機能します。




