脆弱性を見つける⚠
2016-08-26 pixiv社内勉強会 LT
@hakatashi
NodeSecurity.io
NodeSecurity.io
- Node.js関連の脆弱性の検証・認定
- 脆弱性のあるコードを混入させないための
サービス・ツールの提供
Advisories
Advisory
!!!
これを見つけた時の話
遡ること2016年4月
とある事情で
エロゲのレビューデータを
形態素解析する
mecab-async
mecabという外部コマンドを呼び出して
日本語を形態素解析する
npmモジュール
エロゲのレビューデータ
30万件を形態素解析
謎のゴミファイルが出てくる
入力した文章
!?
プルリクチャンス!!!
shell-quoteに問題
- “<”, “>” を含み
- 空白や引用符などを含まない
文字列を正しくクオーテーションしてくれない
shell-quote
substack
200万DL/mo
!?!?!?
脆弱性チャンス!!!
NodeSecurity.ioの
脆弱性報告フォーム
- 4/27, 最初の返信が届く
- 報告フォームがバグっていた(“<”, “>” を正しくエスケープできない)ため、2度送るはめに
- その後、NodeSecurity.ioのチームがsubstackにコンタクトを取る
- 5/17, substackが音信不通との連絡
- second maintainer にコンタクト
- 5/21, NodeSecurity.ioが修正のプルリク作成
- 4/22, 脆弱性報告送信
なかなかマージされない……
45日ルール
※株用語ではない
脆弱性情報は、
報告から45日の間に修正されない場合、
強制開示の対象となる
報告が受理された4/27の
45日後は6/11
この日になってもプルリクはマージされなかった
特例で2週間ほど様子を見ることに
6/18, 無事マージされる
→6/22, 脆弱性情報公開
脆弱性報告で重要なこと
シンプルで強力な
再現コードを作る
再現コード
実際に攻撃を行うことができ、
それによってどんな被害が生じうるのかを示す
コードスニペット
再現コード
これによって示された挙動が、
- 実際のアプリケーションに適用されやすく
- 被害が大きく
- 容易に攻撃可能
であるほど、
- 報奨金が上がる or
- CVSSが上昇する
実際に報告したコード
const sq = require('shell-quote');
const exec = require('child_process').exec;
exec('cat file | '
+ sq.quote(['grep', pattern]));
const sq = require('shell-quote');
const exec = require('child_process').exec;
exec('cat file | '
+ sq.quote(['grep', pattern]));
ローカルファイルを読み込み、
grepコマンドで検索する
pattern = ":</etc/passwd"
exec("cat file | grep :</etc/passwd")
結果
まとめ
- 偶然発見したとはいえ、今まで見つけた中で
一番強烈な脆弱性だった - NodeSecurity.ioがいろいろ代行してくれて便利
- ただし対応遅すぎ
- 任意コード実行までできればよかったが無理だった
"><script>alert('おわり');/*
脆弱性を見つける
By Koki Takahashi
脆弱性を見つける
2016-08-26 pixiv社内勉強会 LT
- 2,481