脆弱性を見つける⚠

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('おわり');/*

Made with Slides.com