メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

汚染された文字列形式

入力形式引数がセキュリティで保護されないソースに由来している

説明

この欠陥は、printf 形式の関数で、セキュリティで保護されていないソースから構築された書式指定子が使用された場合に発生します。

リスク

外部で制御される要素を使用して文字列を形式化すると、バッファー オーバーフローやデータ表現の問題の原因となることがあります。攻撃者はこうした文字列形式の設定要素を利用して、%x でスタックの内容を表示し、あるいは %n でスタックへの書き込みを行うことができます。

修正方法

静的文字列を渡して文字列関数を形式化します。この修正により、外部アクターは文字列を制御できなくなります。

別の修正方法として、必要な数の引数のみを許可します。可能な場合は、脆弱性のある %n 演算子をサポートしない関数を、文字列形式で使用します。

チェッカーの拡張

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

すべて展開する

#include <stdio.h>
#include <unistd.h>
#define MAX 40
void taintedstringformat(void) {
	char userstr[MAX];
	read(0,userstr,MAX);
	printf(userstr);//Noncompliant   
}

この例では、入力引数 userstr を出力しています。この文字列は不明です。そこに % などの要素が含まれている場合、printf では userstr が文字列でなく文字列形式と解釈され、プログラムがクラッシュする原因となります。

修正 — 文字列として出力

1 つの修正方法として、userstr を明示的に文字列として出力し、あいまいさをなくします。

#include "stdio.h"
#include <unistd.h>
#define MAX 40

void taintedstringformat(void) {
	char userstr[MAX];
	read(0,userstr,MAX);
	printf("%.20s", userstr); 
}

結果情報

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

バージョン履歴

R2015b で導入