第3話「セキュリティスペシャリスト登場」
静まり返った深夜のオフィス。
キーボードの音だけが、蛍光灯の下にぽつぽつと響いていた。
納戸納男は、背筋を丸め、無言で画面を睨んでいる。
ログとコードの間を、眼光が何度も往復した。
──セキュリティスキャナーのアラート。
警告内容は、セッション固定化のリスク。
(……この実装、セッションが再生成されていない。
これでは……乗っ取りのリスクがある……)
声にこそ出さないが、喉の奥がつまるような感覚。
コードを巻き戻す。
ログイン処理の直後、セッションIDが再生成されていない。
つまり、攻撃者に先にIDを仕込まれれば、ユーザーがログインしてもそのIDのまま、“なりすまし”が成立する。
「セキュリティ……穴だらけだ…
…これでは納品できない……」
時計の針は、もうすぐ11時を指そうとしていた。
「……なんだ、こんな時間にうるさいのは君か」
静かに、しかし重たく響く声がした。
設計裕が手にしたバインダーをコン、と机に置いた。
「設計書に書いたとおり、だ。
セッションは維持前提。
“ログイン状態をなるべく切らすな”というのがクライアントの要望だったはずだ」
理路整然と整えられた設計書に、寸分の疑いも持っていない。
納男は声を整えて答える。
「……はい。
ですが、現実の実装では、それがセッション固定攻撃に繋がる危険性があります。
セッションIDが再生成されないままだと、非常に危険です」
設計は腕を組み、鋭い眼光をこちらに向けた。
「“危険”というなら、それは実装側が設計意図を汲みきれていない証拠だな。
ログインを安全にしつつ継続させる方法など、設計段階で議論しておくべきだ」
「……確かに、その通りです。
……が、今は、実装の安全性が最優先じゃないですか?」
設計は眼鏡を中指でクイと上げ、首を振る。
「修正には影響が出る。
君の判断だけで動いていい話ではない」
「ええ、ですから、必要最小限の範囲で緩和策を講じます。
設計に逆らうつもりはありません。ただ、“安全な(セーフティ)納品”にしたいのです」
納男の語気には、珍しく強さがにじんでいた。
「……分かった。
くれぐれも影響の出ないようにな。」
ため息交じりにその場を後にする設計と入れ違いに、プロジェクトマネージャーの早刷太郎が姿を見せた。
首元が緩んだTシャツにサンダル姿。
スマホには未読メッセージの通知がいくつも光る。
「聞いた。
セッション周りで不具合が出てるらしいな。
……深刻か?」
「はい。セッションIDの固定化が起きています。
攻撃者が事前にIDを仕込んでいれば、ユーザーのアカウントが…
…乗っ取られます」
「……まいったな……」
早刷は短く息を吐いた。
掌に収まるスマホを見下ろしながら、しばし沈黙する。
「……納期は動かせない。朝9時納品。
もう向こうにも予定流してる。
でも、出して“事故”が起きるぐらいなら、止める判断も辞さない。
……そのために俺がいる」
その一言に、納男の胸が強く締めつけられた。
「いえ。止めません。…どうにかします。
今ある知識と手段を総動員して、攻撃を防げるレベルまで持ち込みます」
「……本当にできるか?」
「……はい。俺なりに、全力で。」
納男の目に力が込められ、攻めるべき峠を前にしたドライバーのような瞳に変わる。
不意に、沈黙と集中が支配するプロジェクトルームに明るい声が響いた。
「すいません、あの、エナドリください!」
ドアを勢いよく開け放ち、その場で仁王立ちした人物――
シワだらけのポロシャツ、寝癖のついた髪、手には雑にまとめた資料の束。
枝分木造だった。
「…さすがに眠気が限界で。
糖分とカフェインで物理的に延命します!」
冷蔵庫を開けて、缶を一本取り出すと「プシュッ」と勢いよく開けた。
ぐい、とラベルをこちらに向けるようにして飲み干す。
「……またオマエか」
早刷が眉間に皺を寄せて枝分を見る。
「夜中に元気なやつは信用できねぇって、前も言ったよな」
「すみません!
でもこの勢いが、チームの雰囲気をドレスアップさせるってことでどうか!」
「ドレスアップじゃなくて、ドレスダウンしてるんだよ。毎回な」
そう言いつつも、早刷の声にはどこか苦笑の響きがあった。
室内の張り詰めた空気が、ほんの少しだけ緩んだ気がした。
そんな中、納男の手は止まらなかった。
HTTPヘッダーの見直し、Cookie属性の再設定、ログイン処理の緩和策──
一つずつ潰していく。
「……IP固定……User-Agentチェック……
でも、これだけじゃ、突破される可能性がある」
擬似攻撃を何度も走らせる。
半分以上が通過する。
冷たい汗が、こめかみを伝う。
(自分の力じゃ……まだ…届かない……)
キーボードから手が離れた。
その瞬間、背後でドアが、静かに開く。
「ん、お疲れ」
臙脂色のネルシャツにカーゴパンツ、黒のエンジニアブーツ。
そしてお気に入りの無骨なノートPC。
電脳充が、眠たげな目で部屋に入ってきた。
「セッションの件、ちょっと気になってさ。
ログ、見た。たしかにヤバいね」
「……ありがとうございます……助かります」
「いや、俺は火種があると見逃せない性質でさ。
そっちはどう?限界?」
納男は俯いたまま、小さくうなずいた。
「……今の俺の技術では、対処しきれませんでした……限界です……」
「オーケー。じゃあ、俺も混ぜて」
電脳はパチ、と指を鳴らして席に座った。
「トークン、ログイン後に1回限りのワンタイム制にすれば、固定化は無効化できる。
セッションごとにシークレット突っ込んで再バインドさせる。
バックエンド改修なしで、リバプロで処理すればギリ間に合う」
電脳の声は落ち着いているが、作業は速い。
独自スクリプトでWAFにルールを追加。
ログ監視と異常時の自動ログアウトも即座に構成した。
「うちの監視サーバーにもルール流す。
万が一突破されても、30秒以内に検出できる」
コードの意味が、納男にはすぐに理解できた。
それだけに、自分の未熟さが胸に刺さる。
(こんな発想、自分にはなかった……)
「……これで、最悪の事態は回避できる。
リリースには耐えるはず。
あとは、明日以降に根本対策。」
電脳が椅子から立ち上がる。
納男は深く頭を下げた。
「ありがとうございました。
……本当に、感謝しています」
「いやいや。
チームなんだし、困った時は助け合いだろ」
こんなこと何でもない、という風にヘラッと笑う電脳。
納男の唇がわずかに動く。
「……納期を守りきれないかもしれない恐怖に、ずっと飲まれそうでした…
まだ、自分の力じゃ、乗り越えられないトラブル(峠)があると……思い知らされました…」
下を向いたまま悔しそうな納男に、電脳はしっかりと声を掛ける。
「でも君、止まらなかったろ?
それが一番すごいよ。
止まらない実装者が、信頼を作るんだ」
翌朝。
全システムチェッククリア。
CIはオールグリーン。
サーバーロードも安定。
スマホの画面には「納品完了」の表示。
納男は、キーボードの上で静かに手を組んだ。
「……走らせるだけじゃない。
“安全な(セーフティ)納品”で届けて、はじめて“納品”だ…」
その独り言と共に、画面の通知が鳴った。
「先方から:動作安定。問題ありません」
納品は、成功した。
蛍光灯の明かりが、ゆっくりと消える。
納男は一人、プロジェクトルームに残っていた。
モニターには「ローンチ成功」のログが点滅している。
監視ツールのグラフは、穏やかな曲線を描き続けていた。
深夜の緊張は嘘のように、世界は何事もなかったかのように動いている。
だが、納男の中では、確実に何かが変わっていた。
彼は椅子の背にもたれながら、そっと天井を見上げる。
「……守れた。
間に合った。納期も、信頼も……なんとか…」
しかしその口調に、どこか微かな悔しさが滲んでいた。
(けど……最後の峠を攻めたのは、俺じゃない…
…電脳さんだった……)
知識も、経験も、発想も、まだ自分の技術は“届いていなかった”ことを痛感する。
同時に脳裏に浮かんだのは、あの厳格な背中だった。
(……父だったら、どうしただろうか)
かつて、どんなバグにも妥協せず、エラーひとつに怒鳴声を上げた父・納戸納蔵。
「未熟を嘆く前に、技術で語れ」と背中で教えてきたその人。
(……きっと、今回のことも、誰よりも早く気づいて、誰よりも早く動いていた。
それでも、自分に“止まるな”とは、言ったはず…)
納男はそっとノートPCを閉じた。
「……次は、“自分の技術”で攻め切ってみせる…!」
その少し濡れた瞳に、ほんのわずか、力強さが加わっていた。