全2757文字

 プログラムに埋め込まれた脆弱性やマルウエア(コンピューターウイルス)などを見つける有効な手段の1つが、そのソースコードを丹念に調べる(レビューする)こと。スキルのある開発者なら、ソースコードを調べることで異常に気づける。

 だが、そういった開発者の目を欺く手法が発表された。ソースコードに細工を施せば、テキストエディターなどで表示されるソースコードの「見た目」を変えられるというのだ。言い方を変えれば、目に見えない脆弱性を埋め込めるという。そんなことが可能なのだろうか。

「トロイの木馬」のソースコード版

 この新手法は、英ケンブリッジ大学の研究者らが2021年11月1日(現地時間)に発表した。「Trojan Source(トロージャンソース:トロイのソース)」と名付けられた。「Trojan Horse(トロージャンホース:トロイの木馬)」にちなんだ命名だと考えられる。

 トロイの木馬とは、ギリシャ神話のトロイア戦争に登場する道具。兵隊を忍ばせた大きな木馬で、敵が気づかずに陣地内に移動させると中から兵隊が飛び出して戦ったとされる。

 このことから、有用なプログラムに見せかけて実行させるマルウエアをトロイの木馬という。今回のTrojan Sourceはそのソースコード版といえるだろう。

 ソースコードに仕込んだ脆弱性を、どのようにして開発者に気づかれないようにするのか。答えは単純。「Unicodeの制御文字」を使ってソースコードの見た目を変えるのだ。Unicodeとは文字コードの一種。文字を扱うプログラムのほとんどが対応している。

 制御文字とは、ディスプレーやプリンター、通信装置などに特別な動作をさせるための文字である。「文字」といっても、標準ではディスプレーなどには表示されない。

 Unicodeには、文字を表示する流れを変える制御文字がある。例えば「RLO(Right-to-Left Override)」は、後続の文字の表示を右から左に表示する。アラビア語のように右から左に文字を読む言語を表示する際などに使われる。「abc[RLO]def」は「abcfed」と表示される([RLO]はRLOの制御文字)。

 そのほか1文字単位ではなくブロック単位で文字の表示を入れ替える制御文字などもある。こういった制御文字をうまく組み合わせれば、脆弱性が埋め込まれたソースコードを、問題のないソースコードに見せかけることが可能になる。

コメントや変数に忍ばせる

 一般的なプログラミング言語では、ソースコードの任意の場所に制御文字を挿入できない。コンパイラーによる変換時(コンパイル時)にエラーが発生する。ただし、コメントと文字列は例外だ。これらはコンパイラーによって解釈されないので、制御文字を含む任意の文字を入れられる。

 そこで、コメントや文字列に制御文字を入れることで、それらをソースコードの一部に見せかけたり、ソースコードがコメントアウトされているように見せかけたりする。

 例えば、実際のソースコードではコメントアウトしている重要な条件式を、制御文字を使ってその条件式が存在するように見せかけられる。

C言語によるTrojan Sourceの例。これは実際のソースコード。色が付いているのが制御文字。制御文字はすべてコメントに収められている
C言語によるTrojan Sourceの例。これは実際のソースコード。色が付いているのが制御文字。制御文字はすべてコメントに収められている
(出所:Trojan Source:Invisible Vulnerabilities)
[画像のクリックで拡大表示]
上のソースコードをテキストエディターなどで表示した例。制御文字により、実際にはコメント中にある条件文「if ( isAdmin )」がコードに含まれているように見える
上のソースコードをテキストエディターなどで表示した例。制御文字により、実際にはコメント中にある条件文「if ( isAdmin )」がコードに含まれているように見える
(出所:Trojan Source:Invisible Vulnerabilities)
[画像のクリックで拡大表示]