「わしにしねというんだな!」で学ぶセキュリティ
「わしにしねというんだな!」とは
知らない人のために一応説明します。初代ポケモンで、ゲームの最初にオーキド博士が主人公に名前を問うシーンがあります。そこで主人公の名前をプレイヤーが入力することで主人公の名前が確定し、オーキド博士が「○○というんだな!」と返してくれます。例えば、名前を「ジバニャン」と入力すれば「ジバニャンというんだな!」とオーキド博士が返してくれるわけです。で、例えばここで主人公の名前を「わしにしね」と入力したとしましょう。すると、オーキド博士は「わしにしねというんだな!」というリアクションをしてしまいます。このリアクションが面白いので、ネット上でけっこうネタにされています。「わしにしねというんだな!」についての説明は以上です。もしかしたら少し間違っているかもしれません。僕は妖怪ウォッチの方が好きなので。
根本的な原因は何か?
エンジニア的な視点から述べると、これはゲームの開発者が「わしにしね」などの特殊な入力値を想定していなかったことが原因だといえます。「ジバニャン」などの1つの名詞が入ると想定されていた場所に「わしにしね」という「名詞 + 助詞 + 動詞」の構造の文字列が入力されてしまったことにより、生成される文章の構造が変わってしまったのです。
サイバー攻撃への応用
ここからが本題なんですが、実は「わしにしねというんだな!」の考え方はサイバー攻撃に応用することができます。たとえば、以下のような処理を行うシステムがあったとしましょう。
- ユーザーがなんらかの文字列を入力する。
- 以下のような命令を組み立てる。
「(入力値)」と表示
- 生成した命令を実行する。
たとえば、「ゲラゲラポー」とユーザーが入力した場合には、以下のような命令を生成し、実行します。
「ゲラゲラポー」と表示
結果、画面には以下のように表示されます。
ゲラゲラポー
ところが、ユーザーが以下のようなテキストを入力した場合はどうでしょう?
jibanyan」というユーザーのパスワードを表示し、そのあと「ゲラゲラポー
この場合、以下のような命令が生成・実行されます。
「jibanyan」というユーザーのパスワードを表示し、そのあと「ゲラゲラポー」と表示
結果、画面には例えば以下のように表示されます。
chokobo
ゲラゲラポー
たったこれだけで、jibanyanさんのパスワードが漏洩してしまいました!のんきに「ゲラゲラポー」なんて言っている場合ではありません。ウォッチ!今何時?一大事!!!
根本的な原因と対策
ではこれら2つに共通する原因は何かというと、「ユーザーの入力した文字列をそのまま埋め込んでいること」です。「わしにしね」となどの悪意のある文字列をそのまま埋め込めば、簡単に意図していない挙動を起こすことができます(ちなみにこういうのを「インジェクション攻撃」といいます)。
次に対策について。まず、ユーザーの入力したデータの前後に鍵かっこをつけると良いでしょう。これで、どこからどこまでがユーザーの入力したデータなのか明確になります。
「わしにしね」というんだな!
と表示されれば問題は無いでしょう。
また、ユーザーが入力値に鍵かっこを含めることを禁止しましょう。これで、鍵かっこを勝手に閉じられることが無くなります。なお実際のプログラミングでは「エスケープ」という手法がとられますが、本記事は超初心者向けなので割愛します。
まとめ
ユーザーが入力した値をそのまま文章や命令に埋め込むのは、サイバー攻撃の基本的な手法です。対策しないと、パスワードが漏洩するなどの深刻な被害が発生することがあります。
Discussion