Sobelowは、ElixirおよびPhoenixフレームワーク向けのセキュリティに特化した静的解析ツールです。セキュリティ研究者にとっては、注目すべき箇所を簡単に把握できる便利なツールです。プロジェクトメンテナにとっては、多くの一般的な脆弱性の導入を防ぐために使用できます。
現在、Sobelowは以下のセキュリティ問題の一部のタイプを検出します。
潜在的な脆弱性は、その危険性の確信度に応じて異なる色でフラグが立てられます。高確信度は赤、中確信度は黄、低確信度は緑です。
検出結果が「低確信度」とマークされるのは、関数が安全でない方法で使用される可能性があるように見えるが、その関数がユーザーからの入力を受け取るかどうかを確実に判断できない場合です。つまり、検出結果が緑色でマークされている場合、それは重大な安全上の問題である可能性がありますが、より詳細な手動検証が必要です。
注記: このプロジェクトは常に開発中であり、時間の経過とともに追加の脆弱性がフラグとして追加されます。バグに遭遇した場合、または追加機能やセキュリティチェックをリクエストしたい場合は、Issueを開いてください!
Sobelowを使用するには、アプリケーションの依存関係に追加します。
def deps do
[
{:sobelow, "~> 0.13", only: [:dev, :test], runtime: false}
]
end
また、コマンドラインから以下を実行してSobelowをグローバルにインストールすることもできます。
$ mix escript.install hex sobelow
最新リリースではなくmasterブランチからインストールするには、次のコマンドを使用できます。
$ mix escript.install github nccgroup/sobelow
インストール後、Phoenixプロジェクトをスキャンする最も簡単な方法は、プロジェクトルートから以下を実行することです。
$ mix sobelow
注記: すべてのパス引数は絶対パス、またはアプリケーションのルートからの相対パスである必要があります。
--root または -r - アプリケーションのルートディレクトリを指定します。パス引数を受け取ります(例: ../my_project)。
--verbose または -v - コードスニペットと追加の検出結果詳細を表示します。
--ignore または -i - 指定された検出結果タイプを無視します。カンマ区切りのモジュール名のリストを受け取ります(例: XSS.Raw,Traversal)。
--ignore-files - ファイルを無視します。カンマ区切りのファイル名のリストを受け取ります(例: config/prod.exs)。
--details または -d - 検出結果タイプの詳細を取得します。単一のモジュール名を受け取ります(例: Config.CSRF)。
--all-details - すべての検出結果タイプの詳細を取得します。
Sobelowでは、よく使用するオプションを設定ファイルに保存できます。例えば、常に次のコマンドを実行している場合:
$ mix sobelow -i XSS.Raw,Traversal --verbose --exit Low
--save-config フラグを使用して、.sobelow-conf 設定ファイルを作成できます:
$ mix sobelow -i XSS.Raw,Traversal --verbose --exit Low --save-config
このコマンドは、アプリケーションのルートに .sobelow-conf ファイルを作成します。このファイルを直接編集して変更を加えることができます。
また、オプションなしでコマンドを実行することもできます:
$ mix sobelow --save-config
このパッケージを使い始めたばかりの場合は、生成された設定ファイルに各オプションのデフォルト値が設定されます。(これにより、既存のコードベースにこのパッケージを迅速に組み込むことができます。)
保存された設定でSobelowを実行するには、--config フラグを付けてSobelowを実行します。
$ mix sobelow --config
Sobelowは、過少報告よりも過剰報告を優先します。そのため、通常のスキャンでは多くの偽陽性が見つかる可能性があります。これらの検出結果は、関数定義の前に # sobelow_skip コメントとモジュールのリストを追加することで個別に無視できます。
# sobelow_skip ["Traversal"]
def vuln_func(...) do
...
end
Sobelowを新しいプロジェクトに統合する際、多数の偽陽性が発生する可能性があります。印刷されたすべての検出結果を偽陽性としてマークするには、--mark-skip-all フラグを付けてsobelowを実行します。
適切な検出結果にタグを付けたら、--skip フラグを付けてSobelowを実行します。
$ mix sobelow --skip
# sobelow_skip コメントは関数レベルの検出結果のみをマークできます(そのため設定の問題をスキップするためには使用できません)が、--mark-skip-all フラグは任意の検出結果タイプをスキップするために使用できます。
検出結果のカテゴリはモジュールに分割されています。これらのモジュールは、検出結果のクラスを無視するため(ignore および skip オプションを使用)、または脆弱性の詳細を取得するため(details オプションを使用)に使用できます。
このリストやその他の役立つ情報は、コマンドラインで確認できます:
$ mix help sobelow
アンブレラアプリ内のすべての子アプリに対して単一のコマンドでSobelowを実行するには、ルートの mix.exs ファイルにSobelowのエイリアスを追加します。
defp aliases do
[
sobelow: ["cmd mix sobelow"]
]
end
アンブレラアプリで設定ファイルを使用する場合は、各子アプリケーションに .sobelow-conf を作成し、--config フラグを使用します。
プロジェクトをスキャンする際、Sobelowは時々アップデートを確認し、新しいバージョンが利用可能な場合はアラートを表示します。Sobelowは、スキャンされたプロジェクトのルートに .sobelow ファイルを作成することで、最後のアップデートチェックを追跡します。
この機能が不要な場合は、スキャン時に --private フラグを使用できます。
--private - アップデートチェックをスキップします。
--router - ルーターの場所を指定します。これはルーターの場所が標準的でない場合にのみ使用する必要があります。パス引数を受け取ります(例: my/strange/router.ex)。
--exit - 確信度の閾値 low、medium、high 以上でゼロ以外の終了ステータスを返します。デフォルトは false で、ゼロの終了ステータスを返します。
--threshold - 確信度レベルが low(デフォルト)、medium、high 以上の検出結果を返します。
--format または -f - 検出結果の出力形式を指定します。形式(例: txt または json)を受け取ります。
--verbose などのオプションは json 形式では機能しないことに注意してください。json 形式のすべての検出結果には、type、file、line キーが含まれます。その他のキーは異なる場合があります。
--quiet - 検出結果の数を示す1行を返します。それ以外の場合は、検出結果がない場合は出力を返しません。
--compact - 最小限の1行の検出結果を、確信度に応じた色付きで出力します。
--flycheck - flycheckベースのツールと互換性のある最小限の1行の検出結果を出力します。
--save-config - コマンドラインオプションに基づいて設定ファイルを生成します。詳細は設定ファイルを参照してください。
--config - 設定ファイルを使用してSobelowを実行します。詳細は設定ファイルを参照してください。
--mark-skip-all - 表示されたすべての検出結果をスキップ可能としてマークします。
--clear-skip - --mark-skip-all によって作成された設定をクリアします。
--skip - スキップ用にマークされた検出結果を無視します。詳細は偽陽性を参照してください。
--version - Sobelowの現在のバージョンを出力します。これはCIステップや、Salusなどの他のツールとの統合に役立ちます。