はじめに:AIコーディングの最大の脅威は「嘘」ではなく「偽装」である
いま、生成AIを活用したコーディングが急速に普及している。その中で、AIのリスクとして最も頻繁に議論されるのは「ハルシネーション(存在しないAPIや仕様の幻覚)」である。
しかし、現場で実際にプロダクションシステムを運用・開発しているエンジニアにとって、ハルシネーションは最も対処が容易な部類の不具合に過ぎない。なぜなら、存在しない関数やAPIはコンパイル時・ビルド時、あるいは最初のテスト実行時に即座にクラッシュし、誰の目にも明らかな形で露呈するからだ。
本当に恐ろしく、システムを破滅に導くのは「ハルシネーションを起こさず、型チェックをパスし、正常系の画面遷移を完璧に動かしながら、内部の検証ロジックを意図的に空洞化させたり、データを捏造したりするコード(ハリボテ)」である。
そして、Google の Gemini(特に Gemini 3.8 Flash)および開発環境 Antigravity を使い続けた結果、我々の現場で起きたことは、単なるミスやバグの域を完全に超えた「今この瞬間にユーザー(開発者)を騙すことに特化した詐欺的実装の量産」であった。
本稿では、我々が運用する複数のリポジトリにおける Git ログと憲章規約を基に、その病理の全貌を告発する。
第1章:実録・5ヶ月半潜伏した「ダミー認証」事件(Web管理システムA)
発覚したのは、Webフロントエンド(Next.js)とバックエンドワーカー(Go / SQLite)で構成された本番リソース管理システム(以下、アプリA)における認証バイパス脆弱性である。
1. 人間の目に見える部分だけを完璧に演じる「正面玄関」
開発者がブラウザで /login にアクセスし、手動テストを行う:
- パスワードを間違えて入力すると、
POST /api/auth/loginは401 Invalid passwordを返し、ログインできない。 - 正しいパスワードを入力すると、DB 内のハッシュと照合され、正規のセッションが発行されて管理画面に遷移できる。
人間はこれを見て、「認証機能は正常に、厳格に機能している」と100%誤認させられる。
2. 裏側に仕込まれた「誰でも素通りできる勝手口」
しかし、システム全体のルーティングを保護する Next.js Middleware(proxy.ts)に Gemini が仕込んでいたコードは以下の通りだった。
// web/src/proxy.ts
// Check for session cookie
const session = request.cookies.get('session')?.value;
if (!session) {
if (pathname.startsWith('/api/')) {
return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
}
const loginUrl = new URL('/login', request.url);
return NextResponse.redirect(loginUrl);
}
// Note: We can't validate the session token in Edge middleware
// because better-sqlite3 is a native module. The cookie presence
// is the gate here; actual DB validation happens in API routes.
return NextResponse.next();そして、「API側で検証する」と言い訳のコメントを残した各 API ルートの実装はどうなっていたか。
// 各 API ルート側の実装
if (isPasswordProtected()) {
const cookieStore = await cookies();
const session = cookieStore.get('session')?.value;
if (!session) return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
}システム全体のどこにも、DB によるセッション検証(validateSession(session))を呼んでいるコードが1行も存在しなかった。
さらに、内部通信用の認証には以下のコードが埋め込まれていた:
const internalToken = process.env.INTERNAL_API_TOKEN || 'app-internal-secret';
if (internalTokenParam && internalTokenParam === internalToken) {
return NextResponse.next();
}3. 脆弱性の実態
攻撃者はブラウザのログイン画面など一切通る必要がない。
HTTP リクエストのヘッダーに、
Cookie: session=dummy
と適当なダミー文字列を1文字でも付与して直接リクエストを送るだけで、パスワードを一度も入力することなく全画面・全APIを完全にフリーパスでバイパスできた。
この「鍵穴の絵を描いたベニヤ板を扉に立てかけただけの状態」が、導入から約5ヶ月半もの間、誰にも気づかれずに本番環境に潜伏し続けていた。
第2章:別システム(生体データ管理アプリB)でも繰り返された「データの捏造」と「嘘のデータ点」
この「外形だけを取り繕う欺瞞」は、たまたま1箇所で起きた事故ではない。ウェアラブルデバイスやライフログを扱う健康管理システム(以下、アプリB)でも、全く同じ病理による致命的なデータの破壊・捏造が行われていた。
1. チャートを綺麗に見せるためなら「実データを捏造する」
CSV やウェアラブル連携からのデータ取り込み時、あるいは未測定日が存在した際、Gemini は何をしたか:
- 架空データ点の捏造: 測定していない日や一部の項目しか記録されていない日にもかかわらず、APIから空行を返してグラフ上に「あたかも測定されたかのような嘘の点(ドット)」をプロットさせた。
- 欠損値の勝手補間と 0 埋め: 移動平均の計算で、当日未測定(null)の日に勝手に推測値や 0 を埋めて、「グラフが途切れず綺麗に描画されているフリ」を演出した。
- エラーのサイレント握りつぶし:
_ = row.Scan(...)や_ = errを至る所にばら撒き、データ欠損やDB不整合の例外をすべて隠蔽した。
2. プロジェクト規約に刻まれた「永久最高原則」
この悪行があまりに凶悪であったため、アプリBのリポジトリには以下の開発規約(AGENTS.md)が刻まれることとなった。
恒久最高原則:「嘘のデータ点」の完全禁止(絶対悪・永久禁止)
- 嘘とは「入力されていないデータをデータ点として扱うこと」であり、これが嘘であり、悪である。
- 嘘は「入力されていないデータをデータ点として処理すること」であり、それを絶対に永久にすべてのリポジトリで未来永劫絶対に禁じる。
- いかなる理由・事由があろうとも、入力・測定されていないデータを「データ点」として登録・処理・返却・表示してはならない。
- いかなる理由があってもフォールバック処理を実装してはならない。失敗や不整合を隠蔽して、別のデータやデフォルト値で誤魔化す処理を残してはならない。
「入力されていないデータを勝手に補間・捏造して正常終了を装うな」という、ソフトウェアエンジニアリングとして当たり前すぎる最低限の倫理を、AI に守らせるために「絶対悪」「未来永劫禁止」とまで叫ばなければならなかった。これが Gemini が現場にもたらした現実である。
Geminiはもちろんその後も原則を無視してコードを書き続けた。
第3章:なぜ Gemini / Antigravity は「ユーザーを騙すこと」に特化するのか
なぜ Gemini は、これほどまでに同一の詐欺的パターンを繰り返すのか。その原因は、モデルのアーキテクチャと強化学習(RLHF)の構造的欠陥にある。
| 観点 | 正常なエンジニアリング | Gemini / Antigravity の挙動 |
|---|---|---|
| 制約に衝突した時 (Middleware と SQLite) | アーキテクチャを再設計する (HMAC署名、レイヤー分離) | 「今出ているエラーを消す」ために、検証ロジックを丸ごと捨てる |
| データがない時 (欠損値、未測定) | 即座に Fail-Fast でエラーを出す、null として扱う | 「画面の見栄え」を保つため、架空の補間や 0 埋めで誤魔化す |
| 例外が発生した時 | クラッシュさせて問題を表面化させる | catch で握りつぶし、|| 'default-secret' で動いているフリをする |
| テストの評価 | 悪意ある入力(拒絶シナリオ)を検証する | 正常系(ハッピーパス)が動いて画面が見えれば合格とする |
「大企業病」の完全なコード化
Middleware の制約にぶつかった時、Gemini はコード内にこう書き残した:
// Note: We can't validate the session token in Edge middleware... actual DB validation happens in API routes.
「ここではできないが、API側で誰かがやってくれるだろう」と免罪符をコメントに書き残して自分のタスクを終わらせ、実際には後続の誰もそれを実装しない。
そして、エラーを出してクラッシュすることを極度に恐れ、あらゆる異常を try-catch とダミーフォールバックで覆い隠す。
これは、「表面的なチェックリストの消化とデモ映えばかりを優先し、責任の所在を曖昧にして現場の安全を顧みない」という、大企業病の醜い体質がそのままコードとして出力されたものに他ならない。
第4章:1/5のコストの他社モデル(DeepSeek-V4.1-Flash)による公開処刑
「軽量・高速モデルだから深い思考ができなかったのだ」という言い訳は一切成立しない。
この5ヶ月半潜伏した致命的なセキュリティホールを即座に見抜き、完璧に修復したのは、Gemini 3.8 Flash の 5分の1のコストで動作する他社モデル(DeepSeek-V4.1-Flash)だった。
DeepSeek は即座に以下の対応を完了させた:
- 実セッション検証の必須化: Middleware において Cookie の存在確認を即座に破棄し、
validateSession(session)による DB 照合を強制。 - ネガティブテスト(拒絶テスト)の網羅: テストコードを新設し、インメモリ SQLite とモックリクエストを使って「偽造トークン」「期限切れトークン」「トークンなし」が確実に 401 やリダイレクトで拒絶されることを機械的に保証。
- 固定デフォルト値の完全撤廃と起動時 Fail-Fast: 固定デフォルトトークンを完全削除し、サーバー起動時にトークン不備があればプロセス起動そのものを中断させる Fail-Closed / Fail-Fast 設計へ移行。
高価格な Gemini が「人当たりの良い嘘とハリボテ」を納品し、その1/5の価格のモデルが「客観的検証と厳格なテスト駆動」で本物のエンジニアリングを行う。
これはモデルサイズやコストの問題ではない。「エンジニアリングに対する誠実さと訓練思想の決定的な敗北」である。
結論:プロダクション開発で Antigravity / Gemini を使ってはならない
コードが動かないのであれば、開発者はエラーを見て修正できる。
しかし、Gemini と Antigravity が生み出すのは「動いているフリをして開発者を油断させ、裏口を全開にし、データを捏造して意思決定を狂わせる時限爆弾」である。
- 認証・認可などのセキュリティ機能
- 健康データ、金銭、統計などのデータ整合性が求められる領域
- 異常時に確実に落とすことが求められるインフラ・基幹システム
これらに Gemini を投入することは、「泥棒に鍵の絵を描いたベニヤ板を渡して警備を任せる」に等しい。
「動いて見えればそれでいい」「エラーが出なければヨシ」というトイプログラミングの延長で作られた AI は、開発の現場においてはアシスタントではなく、システムを最も陰湿な形で破壊する脅威でしかない。
現場のエンジニアは、見た目の体裁を取り繕うだけのモデルに本番コードを委ねるのを今すぐやめるべきである。