
「見えない文字」が、AIの書いた記録に本物のまま入っていた

10月のある日、AIと一緒に、ここまで作ってきたアプリの点検をしていた。コードを機械で読んで、あやしい書き方を探す道具にかけ、出てきた指摘を1件ずつ確認していく。
その中に「目に見えない文字」が2か所あった。ん?何それ?って感じ。
文字の中には、画面には何も出ないのに、そのあとの文字の並び方を逆向きに見せるものがある。U+202E という番号の文字がそれで、アラビア語のように右から左へ書く言葉を混ぜて表示するときに、向きを強制的に変えるための文字なんだって。
悪用すると、人には安全な文に見えるのに、コンピューターには別の中身として届く。画面では文字を並べ替えて見せていても、コンピューターは元の順番のまま読むみたい。人が「ただの説明のメモ」と思って読んだ部分が、コンピューターにとっては実行する命令になっているってことが起きる。2021年に英国ケンブリッジ大学の研究者が「Trojan Source」と名付けて公表した、セキュリティの世界では有名な攻撃の型らしい。
見つかった2か所は、コードのメモ書き(コメント)の中にあった。名前の入力欄でこの攻撃を防ぐ仕組みの説明のメモに「例」として書かれていた。アプリの動く部分ではないので、すぐに害が出るものではない。でも本物の文字は置かないで、「U+202E」という番号の書き方に直すことにした。
ヒヤッとしたのは、そのあと。
AIがこのことを、作業の記録(ファイル)に残した。
「番号の書き方に直す」と書いたその場所に本物の U+202E が入っていた。AIはプログラムの中で文字を表す特別な書き方(\u202e のような形)で書いていた。この書き方は、保存の途中で本物の文字に置き換わることがある。
画面に出ない文字なので、その文字そのものは、読み返しても私たちには見えない。送り出す前に機械で調べる守り(push の前の検査)もあったが、この文字は見ていなかったので、素通りした。
気づいたのは、AI自身だった。AIが記録を読み直したら、出てきた文字の並びがおかしかった。「本物の文字が入ってしまったかもしれない」と確かめ直した。文字そのものは見えなくても、まわりの表示を崩すことで、そこにあるとわかった。
「見えない文字に気をつけて」と書いた記録の中に、見えない文字。
え、ちょ、まって?どういうこと?ってなった。
すぐさま記録とメモ書きを番号の書き方に直し、送り出す前の検査に「足した行に向きを変える見えない文字の仲間があれば止める」を足した。
今回は運よく気づけた。今後は運に頼らないために機械に止めてもらう。
AIが書いたものは、私が読んで確かめればいいと思っていたけど、そもそも読んでも見えないものがあるんじゃ拾いきれないよね。
見えない文字は、ネットからコピーした文章や、AIに作ってもらった文章にも混ざることがある。
今、私がやっていること。
AIが作成した文章やコピーした文章を、目で読むだけでなく、機械にも調べてもらうことにした。プログラムを動かせるAI(ChatGPT のデータ分析や Claude Code など)なら「この中に目に見えない文字が入っていないかプログラムで調べて。あれば、何行目のどの文字か教えて」と頼める。
同じ型のニュース(参考)
見た目は同じなのに中身が違う、は最近のニュースでも話題だね。
キリル文字(ロシア語などの文字)で英字にそっくりに作った偽サイトのアドレスが、Chrome の偽サイト対策をすり抜けたと10月に報じられた。JPCERT/CC も、こうした見た目の似た文字を使ったアドレスに注意するよう呼びかけている。ログインするサイトは、メールのリンクからではなく、自分のブックマークから開く
人には見えないのにAIには読める文字で隠れた指示を紛れ込ませる手口。迷惑メールが言葉の検査をすり抜けるのにも使われていた(マイクロソフトの公式ブログ・英語)
AIに「しないで」とお願いしても止まらなかった話。
文字の話をもう1つ。1文字直そうとしたら、文章が丸ごと文字化けした話。
ワンポイント用語
push(プッシュ):自分の手元のパソコン(ローカル)で直したものを保管庫(本番環境やほかの人が見る場所)へ送り出すこと。その直前に、機械が中身を検査するようにしている
Trojan Source(トロイの木馬のソース):見えない文字で、人が読むコードと、コンピューターが受け取るコードを食い違わせる攻撃の型
ホモグラフ攻撃:形の似た別の文字(キリル文字の「а」と英字の「a」など)で、本物そっくりのアドレスを作る手口
ASCII smuggling(アスキー・スマグリング):人には見えない文字に、AIへの指示などを隠して運ぶ手口。smuggling は「密輸」
プロンプトインジェクション:AIが読む文章に悪意ある命令を意図的に紛れ込ませて、AIを本来と違う動きにさせる攻撃