Railsアプリケーションの
脆弱性動的自動検査

2019-08-29 Cookpad 夏季就業型インターン成果発表会 成果報告

@hakatashi

(最終成果報告)

@hakatashi

  • 大学4年生
  • インターン (高難易度技術コース, ~8/30)
  • Webエンジニア
    • フロントエンド得意マン
  • 趣味
    • ルービックキューブ
    • 小説
    • CTF
    • アイマス
  • Twitter: @hakatashi
  • GitHub: @hakatashi
  • hakatashi.com

脆弱性に対処する

  • 脆弱性を生まない
    • 適切なフレームワークを使う
  • 脆弱性を発見する
    • 人間が頑張る
      • エンジニアが頑張る
      • 報奨金制度
    • 自動で脆弱性を見つける
      • 静的検査
      • 動的検査 ←今回のターゲット

動的脆弱性解析

動的脆弱性解析

実際に動いているアプリケーションに対して
攻撃を仕掛け、脆弱性が存在するかどうか
確認する

動的解析の利点

  • 実際に攻撃が通ったかまで検証できるので、
    偽陽性を極力少なくすることができる
    • 逆に、偽陰性は増える
  • つまり、動的解析で発見された脆弱性は
    「確実に直さないとヤバい」

欠点

  • 到達不能なアドレスは検知できない
  • 到達不能なパラメーターは検知できない
  • 重い

Ruby on Rails に特化した
動的脆弱性検査

インターンでの成果物

動的解析の欠点に対応

  • 到達不能なアドレスは検知できない
    • Railsならroutes.rbを見れば一発
  • 到達不能なパラメーターは検知できない
    • 静的解析を組み合わせて対処
  • 重い
    • Controllerのメソッド単位の呼び出しで
      オーバーヘッドを最小限に

対象の
Railsアプリ

DB

③アクセス
を監視

ファイル
システム

攻撃
スクリプト

②攻撃
ペイロード

①静的解析でURLと
パラメーターを取得

④実際に攻撃が発火したか
確認する

レスポンス
(XSSなどを検証)

脆弱性レポート

デモ

やりきれなかったこと

  • paramsの抽出を​もう少し詰める
  • SQLi以外の脆弱性の検知
    • XSS検知は現状だいぶお粗末
  • 各種特殊ケースのハンドリング

ありがとう
ございました!

おまけ (時間があれば)

URLパラメーターの抽出

残念ながらRailsのURLパラメーター
統一的なインタフェースでアクセスできない。

現在、パラメーターの抽出はRubyのコードをパースして
静的解析で抽出している。

一言で言うとparams変数を見るだけだが⋯⋯

if params[:hoge] == 'fuga'
  # ここに脆弱なコードを入力
end
user = User.find_by(id: params[:user_id])
return not_found unless user.present?

# ここに脆弱なコードを入力
if params[:password] == params[:password_confirm]
  # ここに脆弱なコードを入力
end
if params[:user][:password].present?
  # ここに脆弱なコードを入力
end
class UserController
  before_action :set_user

  def show
    # ここに脆弱なコードを入力
  end

  private

  def set_user
    @user = User.find_by(id: params[:user_id])
    return not_found unless @user.present?
  end
end
%i[user password].each do |keyword|
  return bad_request if params[keyword].nil?
end
# ここに脆弱なコードを入力
class UserController
  def show
    parameters = user_params
    # ここに脆弱なコードを入力
  end

  private

  def user_params
    params.require(:user).permit(:name, :email)
  end
end

パターンが多くて大変!

→rspec-mockのdoubleみたいな手法で
paramsへのアクセスも動的に解析する?

パラメーターの抽出は今後の課題

おわり

Made with Slides.com