
OpenAPIベースのAPI向け自動認可セキュリティスキャナ。差分的応答分析により、複数の認証情報セットでGETエンドポイントをテストし、権限昇格や壊れたアクセス制御のバグを検出します。
現代のWebアプリケーションにおける認可のセキュリティ問題は、セキュリティスキャナーでは容易に検出できません。例として Shopify、LINE、NordVPN があります。 その理由の一つは、セキュリティスキャナーが主にSQLi、XSS、RCEを探すのに対し、認可のセキュリティバグを探していないこと、そしてスキャナーは通常、Webアプリケーションがどのように動作すべきかという知識を持っていないことです。そのため、現在の認可バグの大部分は主に手動で発見されています。 OpenAPI Security Scannerは、自動化と手動レビューの両方で認可のセキュリティ問題を発見するために作成されました。これは外部のユニットテストツールのように動作し、すべてが期待通りに動作していることを確認します。
このvideoを見ながら進めるか、読み進めてください。
このプロジェクトをForkまたはクローンし、以下の手順に従って開始してください。
このスキャナーを使用するワークフローは次のようになります。
開発者にとって、このツールを使用することで、APIが内部的にも外部的にも期待通りに動作するという追加の確証が得られます。また、パイプライン https://docs.gitlab.com/ee/ci/triggers/ をトリガーすることで、コードデプロイのたびにスキャナーを起動できます。
バグバウンティハンターにとって、このツールを使用することで、対象のAPIを常に把握しておくことができます。なぜなら、特定のエンドポイントが以前は脆弱でなかったとしても、様々な理由で将来脆弱になる可能性があることを誰もが知っているからです。そのため、バグハンティングの手動部分をこのツールで自動化する方が簡単です。
対象APIをスキャンする許可があることを確認してください。
WebアプリケーションのOpenAPI yamlファイルが必要です。それをリポジトリ内の api.yaml の内容と置き換えてください。
api.yaml の内容を対象のOpenAPI yamlファイルに置き換え、GitLabプロジェクトの Settings -> CI/CD -> Variables を展開し、以下の形式で変数を入力します。
ここで提供された認証情報は、Authorization: Bearer ヘッダー形式でAPI呼び出しに渡されます。少なくとも2つの異なる権限を持つユーザーアカウントのアクセストークンを準備することを推奨します。また、ユーザーアカウントごとに複数のアクセストークンを作成し、異なるスコープのアクセストークンに対する正しい動作をテストすることもできます。
{
"<user_a>":[
{
"scope":"<scope>",
"access_token":"<value>",
"name":"<name_of_access_token>"
},
{
"scope":"<scope>",
"access_token":"<value>",
"name":"<name_of_access_token>"
}
],
"<user_b>":[
{
"scope":"<scope>",
"access_token":"<value>",
"name":"<name_of_access_token>"
}
]
}
ここで提供するエンドポイントは GET ベースのAPI呼び出しである必要があります。JSONボディにクエリを含めることもできます。以下の例では、エンドポイントは /org/{orgs}/repos で、クエリは type=all です。エンドポイント /repos/{owner}/{repo} にはクエリはありません。
{
"/orgs/{org}/repos":{
"type":"all"
},
"/repos/{owner}/{repo}":{
}
}
パス変数はここで提供できます。スキャナーはパス変数の値からすべての組み合わせを生成します。
{
"org":[
"test-org"
],
"owner":[
"ngalongc",
"reconless"
],
"repo":[
"public-repo",
"private-repo"
]
}
この場合、以下の組み合わせのAPI呼び出しが生成され、それらはすべて OPENAPI_CREDS で提供された異なる認証情報セットによって呼び出されます。
/orgs/test-org/repos?type=all
/repos/ngalongc/public-repo
/repos/ngalongc/private-repo
/repos/reconless/public-repo
/repos/reconless/private-repo
https://gitlab.com/-/profile/personal_access_tokens にアクセスし、api アクセストークンを作成し、ここで値を置き換えてください。このGitLabアクセストークンは、GitLabランナーからスキャン結果をダウンロードするために使用されます。
<YOU_GITLAB_API_ACCESS_TOKEN>
これはAPIサーバーのベースURLの値です。
https://example.com/api/v3
APIの変更が検出されたときのSlack通知のスクリーンショット
アーティファクトのスキャン結果のスクリーンショット
サンプルレポート: https://ngalog-gitlab.gitlab.io/-/openapi_security_scanner/-/jobs/966841401/artifacts/sample.html
GET ベースのエンドポイントのみテスト可能/users/{user_id}/activities のような一部のAPIエンドポイントでは、呼び出されるたびに応答が異なるため、この種のAPIの変更を検出することは意味がありませんコントリビューションは、オープンソースコミュニティを学び、刺激を受け、創造する素晴らしい場所にしています。皆様のコントリビューションを心から感謝します。
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)MITライセンスの下で配布されています。詳細は LICENSE を参照してください。
Ron Chan - @ngalongc
プロジェクトリンク: https://gitlab.com/ngalog-gitlab/openapi_security_scanner