メインコンテンツ

汚染されたモジュロ演算子

残余演算 (%) のオペランドがセキュリティで保護されないソースに由来

説明

この欠陥は、残余演算 (%) 内の整数オペランドの一方または両方がセキュリティで保護されていないソースから取得された場合に発生します。

リスク

  • 2 番目の残余オペランドが 0 である場合、残余演算は失敗し、プログラムはクラッシュします。

  • 2 番目の残余オペランドが -1 である場合、オーバーフローし得る除算演算を基に残余演算が実装されていると、その残余演算はオーバーフローする可能性があります。

  • オペランドの 1 つが負である場合、演算の結果は不確定になります。C89 ではモジュロ演算は標準化されていないため、負のオペランドによる結果は処理系定義となります。

こうしたリスクは、攻撃者によってプログラムあるいはターゲット一般へのアクセスに利用される場合があります。

修正方法

モジュロ演算を実行する前に、オペランドの値を検証します。2 番目のオペランドの値が 0-1 かどうかをチェックします。両方のオペランドの値が負の値かどうかをチェックします。

チェッカーの拡張

既定では、Polyspace® は外部ソースからのデータは汚染されていると仮定します。Polyspace 解析での汚染のソースを参照してください。Polyspace 解析の現在のスコープ以外から発生したすべてのデータを汚染されたものと見なすには、コマンド ライン オプション [-consider-analysis-perimeter-as-trust-boundary] を使用します。

すべて展開する

#include <stdio.h>
extern void print_int(int);

int taintedintmod(void) {
    int userden;
    scanf("%d", &userden);
    int rem =  128%userden; //Noncompliant
    print_int(rem);
    return rem;
}

この例では、関数がユーザー入力を使用してモジュロ演算を実行します。残余を計算する前に、プログラムをクラッシュさせる可能性のある 0 や -1 などの値に対して入力がチェックされていません。

修正 — オペランドの値をチェック

1 つの修正方法として、モジュロ演算を実行する前にオペランドの値をチェックします。次に示す修正例では、モジュロ演算は 2 番目のオペランドが 0 より大きい場合にのみ続行します。

#include<stdio.h>
extern void print_int(int);

int taintedintmod(void) {
    int userden;
    scanf("%d", &userden);
    int rem = 0;
    if (userden > 0 ) { 
        rem = 128 % userden; 
    }
    print_int(rem);
    return rem;
}

結果情報

グループ: 汚染されたデータ
言語: C | C++
既定値: オフ
コマンド ライン構文: TAINTED_INT_MOD
影響度: Low

バージョン履歴

R2015b で導入