脆弱性のあるコードを実際にデバッグして学べる「Secure Code Game」で学ぶXXE攻撃
セキュアコーディングに触れてみよう!
GitHubが公開している脆弱性のあるコードを実際にデバッグして学べる 「Secure Code Game」 を実際に遊んでみたので、せっかくなのでどんな感じだったか学びをまとめてみます。
参考記事:
遊び方
コードが置いてあるだけなので最初「?」となりましたが、おおよそ以下の流れで進めました。
まず https://github.com/skills/secure-code-game をクローンします。
(私はGitHub Codespacesを利用したので、特に環境構築はせず進めました。)
Season-2のディレクトリを見るといくつかLevelがあるので、好きなのを選びます。
今回はLevel4がJavaScriptで書かれていたので、そちらをやることにします。
(言語の種類としては、JavaScript/Go言語/Python/C言語などがあります。)
ここからがややこしいんですが、問題の前提となる背景はSeason-2内のREADME.mdに記載されているので、取り組みたい問題の箇所を読みましょう。
ちなみにLevel4の問題(機械翻訳)はこちら
惑星XMLon
新しく発見された惑星XMLonの活気ある風景の中で、大胆なEXXplorerとして冒険に乗り出しましょう。
エイリアンの住人は、データ通信の謎の混乱に困惑しています。
それは、E.T.が意図した以上の機能を追加したことが原因かもしれません。
地球外のXMLシグナルを解読し、タグ、属性、.adminファイルの星座に隠された秘密を解き明かす手助けをしてください。
あなたはそれらすべてを守ることができますか?
…とまぁ読んでもよくわからないんですが、とりあえず進めます。
細かい進め方は実際のREADMEを読んでいただければと思いますが、基本は脆弱性のあるコードが書かれていて、そのままだと脆弱性をついた攻撃をしてくるテストコードが失敗する形になっています。
ので、 脆弱性を見つけ出し、コードを修正して脆弱性をついた攻撃をしてくるテストコードをグリーンにするとクリア 、となるようです。
私はひとまずはコードリーディングをしながら脆弱性や、その対策、気をつけるポイントを理解する形で進めてみていました。
今回の脆弱性「XXE(XML External Entity)」
さて、今回見たコードにはXXE(XML External Entity)と呼ばれる脆弱性が含まれていました。
(浅学ながら、この脆弱性知りませんでした…)
参考記事:
XMLをパースする際にEntityとして記述しているファイル内のコンテンツを参照してXMLに読み込んで利用する事ができます。
例として、
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE memberlist[
<!ENTITY xxx SYSTEM "xxx.txt">
]>
<memberlist>
<member>
<name>XXX</name>
<department>&xxx;</department>
</member>
</memberlist>
のようなXMLをパースする際に、 xxx.txt
内に hogehoge
という記述がある場合、
<department>&xxx;</department>
→ <department>hogehoge</department>
という形で置換されて読み込まれる、ということになります。
今回の問題では、(※もう必要なさそうな)ファイルアップロードのエンドポイントと、
合わせてリクエストされたXMLをパースしてOSコマンドを実行できるエンドポイントを含むAPIだったため、
以下のような攻撃の可能性がある、というものでした。
- 悪意あるコマンドの書かれたファイルをアップロードする。
- 1.のファイルを参照するようなXMLをリクエストすることで、攻撃者は任意のコマンドを実行できる。
今回の問題の解答は以下でした。
- 不要なコードを削除する。
- XMLパース時にEntityを置換しないようにする。
- OSコマンドを実行する処理を削除する。
まとめ
脆弱性そのものの解説に主眼が置かれているためか、問題として置かれているコードがなかなかに乱暴だな…という印象はありましたが、
知らなかった脆弱性や、対処・気をつけるポイントを知ることができました。
CodeQLなどのセキュリティ静的解析のアプローチにも触れられているので、
セキュアコーディングに興味のある方は一度見てみても面白いかなと思います。
以上です!
読んでくださってありがとうございました!
Discussion