ブログ

Coders Conquer Security OWASP Top 10 APIシリーズ - オブジェクトレベルの認可不備(BOLA)

September 9, 2020
マティアス・マドゥ博士

今日のサイバーセキュリティに対する脅威は、いたるところに存在し、容赦ありません。その状況は深刻化しており、プログラムのデプロイ後に対応しようとしても、追いつくことはほぼ不可能です。しかし、DevSecOpsや継続的デリバリーが普及し、かつてないほど多くのデータが扱われる現代において、賢明な組織は開発者がセキュリティ意識の高いスペシャリストへと成長できるよう支援しています。これにより、脆弱性が本番環境に到達する前に排除することが可能になります。これまで私たちはWeb脆弱性に加え、独自のInfrastructure as Code(IaC)におけるトップ8のバグについて取り上げてきました。そして今、ソフトウェアセキュリティにおける次の大きな課題に目を向ける時が来ました。準備はいいですか?

このブログシリーズでは、アプリケーション・プログラミング・インターフェース(API)に関連する最悪のセキュリティバグのいくつかに焦点を当てます。これらは非常に深刻であり、Open Web Application Security Project(OWASP)が公開するAPI脆弱性トップリストにも名を連ねています。現代のコンピューティングインフラにおいてAPIがいかに重要であるかを考えると、これらはアプリケーションやプログラムから何としても排除しなければならない重大な問題です。

コードを用いてセキュリティを強制することが不可欠である理由は、「オブジェクトレベルの認可不備」という脆弱性を検証することで明確に理解できます。これは、どのユーザーがオブジェクトやデータを閲覧できるかをプログラマーが明示的に定義しなかったり、オブジェクトの閲覧、変更、操作、アクセスを行うための検証プロセスを実装しなかったりした場合に発生します。その結果、攻撃者はAPIエンドポイントを通じてオブジェクトやデータを操作・閲覧できるようになります。APIエンドポイントとは、APIと他のシステム間の通信に使用される接点(多くはURL)のことです。アプリ間の接続性は世界中で愛されるソフトウェアの発展に寄与してきましたが、エンドポイントが堅牢でなければ、複数の脆弱性を露呈させるリスクを伴います。

また、コーダーが親クラスからプロパティを継承する際、その過程で重要な検証プロセスが欠落していることに気づかない場合にも発生します。一般的に、ユーザー入力を使用してデータソースにアクセスするすべての関数には、オブジェクトレベルの認可チェックを含める必要があります。

すでにこの問題に精通しており、今すぐアクセス制御のバグを見つけて修正・排除できる自信はありますか?ゲーミフィケーション形式のチャレンジに挑戦してみましょう:

結果はどうでしたか?スコアを上げたい方は、引き続き読み進めてください!

オブジェクトレベルの認可不備の脆弱性には、どのような例があるのでしょうか?

オブジェクトレベルのアクセス制御における脆弱性は、攻撃者が本来許可されるべきではない操作を実行することを可能にします。これには、管理者のみが実行すべきデータの閲覧やレコードの削除といった操作が含まれます。高度にセキュアな環境では、特定の権限を持つユーザー以外にはレコードの閲覧を一切許可しないといった対策が必要になることもあります。
オブジェクトレベルの認可を定義する際は、あらゆる操作の可能性を考慮に入れるべきです。例えば、Java Spring APIにおいて問題が発生しうるエンドポイントは、以下のようなコードになります:

public boolean deleteOrder(Long id) {
       Order order = orderRepository.getOne(id);
       if (order == null) {
           log.info("No found order");
           return false;
       }
       User user = order.getUser();
       orderRepository.delete(order);
       log.info("Delete order for user {}", user.getId());
       return true;

このAPIエンドポイントはIDに基づいて注文を削除しますが、その注文が現在ログインしているユーザーによって作成されたものかどうかを検証していません。これにより、攻撃者がこの抜け穴を悪用して他人の注文を削除できるリスクが生じます。

安全なアクセス制限を適切に実装するには、コードは以下のように記述されるべきです:

public boolean deleteOrder(Long id) {
       User user = userService.getUserByContext();
       boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));
       if (orderExist) {
           orderRepository.deleteById(id);
           log.info("Delete order for user {}", user.getId());
           return true;
       } else {
           log.info("No found order");
           return false;

オブジェクトレベルの認可不備の脆弱性を排除する

アクセス制御のコードは、過度に複雑である必要はありません。Java Spring API環境の例であれば、誰がオブジェクトにアクセスできるかを厳密に定義することで修正可能です。

まず、リクエストを行っているのが誰であるかを特定するための検証プロセスを実装する必要があります:

User user = userService.getUserByContext();

次に、オブジェクトIDが存在し、かつリクエストを行ったユーザーに属していることを確認する必要があります。

boolean orderExist = getUserOrders().stream()
               .anyMatch(order -> (order.getId() == id));

最後に、オブジェクトの削除を実行します。

orderRepository.deleteById(id);

コード内の認証方式が、組織のユーザーポリシーやデータアクセス制御と整合していることを必ず確認してください。コードの安全性を完全に確保するためには、権限レベルの異なるユーザーが業務に必要なデータにはアクセスでき、制限されるべきデータにはアクセスや変更ができないよう、検証を行う必要があります。これにより、意図せず見落とされていたオブジェクト制御の脆弱性が明らかになる可能性があります。

これらの例から得られる重要な教訓は、まずユーザーがオブジェクトに対して実行可能なすべてのアクションを定義し、その上で強力なアクセス制御をコードに直接組み込むことです。また、親から継承されたプロパティに依存したり、権限の管理を外部に委ねたりしてはいけません。保護が必要なすべてのオブジェクトタイプに対して、ユーザーの権限とアクションをコード内で明示的に定義してください。

この脆弱性に関する詳細や、その他のセキュリティ上の欠陥から組織や顧客を守る方法については、Secure Code Warriorのブログをご覧ください。また、デモを試して、Secure Code Warriorのトレーニングプラットフォームでサイバーセキュリティスキルを常に最新の状態に保つことも可能です。



タグライン

AI主導の開発をリリース前にガバナンスする

AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。

デモを予約する
リソースライブラリ

他のブログ記事を見る

セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。

すべて表示
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

セキュリティ文化の統一:Sageはいかにしてチャンピオンプログラムを構築したか

Sageがどのようにして柔軟かつ関係性を重視したアプローチでセキュリティを強化し、200名以上のセキュリティチャンピオンを育成して、目に見えるリスク低減を実現したのかをご紹介します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

2026年サイバーセキュリティ意識向上月間:企業防衛に不可欠なAIセキュリティの理解

主要なAI企業の多くが、安全対策が追いつくまでの間、AI開発を世界的に減速させるよう公に呼びかける事態となっています。しかし現実には、深刻なセキュリティ問題はすでに顕在化しています。AI導入に伴う金銭的コストやリスクが増大し続ける中、多くのセキュリティリーダーや経営陣は差し迫った状況に追い込まれています。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

イネーブラー8:プログラムのブランディング

セキュアコーディングプログラムを成功させるには、優れたコンテンツ以上のものが必要です。イネーブラー8では、ブランディングによって参加を「憧れのステータスを得る体験」へと変える方法を解説します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

すべての従業員が今、AIサイバーセキュリティの最前線に立っている

エンタープライズテクノロジーの状況は、手遅れになるまで誰も予測できなかったほどの速さで変化しています。私たちは今、人間が書いたコードと基本的なコパイロット支援の時代から、エージェント型開発ライフサイクル(ADLC)の時代へと正式に足を踏み入れました。自律型AIエージェントは、複数の機能にわたってかつてない効率性をもたらす一方で、全く新しい種類のセキュリティリスクや規制リスクも引き起こしています。

詳細はこちら

AIを活用した開発をリリース前にセキュアに

開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。

デモを予約する
該当する項目が見つかりません。