メインコンテンツ

CWE Rule 489

Active Debug Code

R2023a 以降

説明

ルールの説明

The application is deployed to unauthorized actors with debugging code still enabled or active, which can create unintended entry points or expose sensitive information.

Polyspace 実装

このルール チェッカーは、[禁止された関数の使用] をチェックします。

すべて展開する

問題

この問題は、禁止された関数のブロックリストに追加されている関数を使用した場合に発生します。ブロックリストを作成するには、次のようにします。

リスク

関数は、以下のいずれかの理由でブロックリストに追加されます。

  • その関数により動作が未定義のさまざまな状況が発生し、セキュリティの脆弱性につながる可能性があり、より安全な別の関数が存在している。

    [危険な標準関数を使用しています][旧式の標準関数が使用されています] などの既存のチェッカーによって明示的にチェックされない関数を禁止できます。

  • 関数が、C++98 から C++11 へなどの移行の一環として非推奨になっている。

    移行の一環として、置き換える必要がある関数のリストを作成し、このチェッカーを使用してそれらの使い方を特定できます。

修正方法

ブロックリストに登録されている関数を、許可リストに登録されている関数に置き換えます。

このチェッカーをグループ、プロジェクト、または組織に公開する場合は、ブロックリストに登録されてる関数とその代替関数のリストを作成し、結果のレビュー担当者がそのリストを参照して適切な置き換えができるようにします。

チェッカーの拡張

この欠陥チェッカーには、関数のブロックリストを指定する必要があります。オプション [欠陥の検出] (-checkers) を使用してチェッカーを指定しても、ブロックリストも指定しなければ、チェッカーは有効になりません。Bug Finder チェッカーを使用した非推奨の関数または安全でない関数、キーワード、またはマクロのフラグ設定を参照してください。

例 — 禁止された関数 std::signal の使用

#include <csignal>
#include <iostream>

namespace
{
  volatile std::sig_atomic_t gSignalStatus;
}

void signal_handler(int signal)
{
  gSignalStatus = signal;
}

int main()
{
  // Install a signal handler
  std::signal(SIGINT, signal_handler);  //Noncompliant

  std::cout << "SignalValue: " << gSignalStatus << '\n';
  std::cout << "Sending signal " << SIGINT << '\n';
  std::raise(SIGINT);
  std::cout << "SignalValue: " << gSignalStatus << '\n';
}

関数 std::signal を非推奨にする場合を考えます。次のコード動作仕様を XML 形式で定義します。

<?xml version="1.0" encoding="UTF-8"?>
<specifications xmlns="http://www.mathworks.com/PolyspaceCodeBehaviorSpecifications">
  <functions>
     <function name="std::signal">
        <behavior name="FORBIDDEN_FUNC"/>
     </function>
   </functions>
</specifications>
オプション -code-behavior-specifications を使用して XML ファイルを指定します。

解析結果では、関数 std::signal のすべての使用にこのチェッカーによるフラグが設定されます。

例 — C++ のオーバーロードされた演算子のブロックリスト登録

class orderedPair {
        int var1;
        int var2;
    public:
        orderedPair() {
            var1 = 0;
            var2 = 0;
        }
        orderedPair(int arg1, int arg2) {
            var1 = arg1;
            var2 = arg2;
        }
        orderedPair& operator=(const orderedPair& rhs) {
            var1 = rhs.var1;
            var2 = rhs.var2;
            return *this;
        } 
        orderedPair& operator+(orderedPair& rhs) {
            var1 += rhs.var1;
            var2 += rhs.var2;
            return *this;
        }  
};

void main() {
    int one=1, zero=0, sum;
    orderedPair firstOrderedPair(one, one);
    orderedPair secondOrderedPair(zero, one);
    orderedPair sumPair;
    
    sum = zero + one;
    sumPair = firstOrderedPair + secondOrderedPair;  //Noncompliant 
}

orderedPair クラス内で演算子のオーバーロードが使用されているすべての場所を特定する場合を考えます。オーバーロードされた演算子をテンプレート XML ファイルに追加し、

<?xml version="1.0" encoding="UTF-8"?>
<specifications xmlns="http://www.mathworks.com/PolyspaceCodeBehaviorSpecifications">
  <functions>
     <function name="orderedPair::operator=">
        <behavior name="FORBIDDEN_FUNC"/>
     </function>
     <function name="orderedPair::operator+">
        <behavior name="FORBIDDEN_FUNC"/>
     </function>
   </functions>
</specifications>
オプション -code-behavior-specifications を使用して XML ファイルを指定します。

解析では、オーバーロードされた演算子のすべての呼び出しが特定され、それらの使用にフラグが設定されます。この方法を使用すれば、演算子のすべてのインスタンスを検索して参照するのではなく、演算子の特定のオーバーロードを区別できます。

チェック情報

カテゴリ: Bad Coding Practices

バージョン履歴

R2023a で導入