CWE Rule 134
説明
ルールの説明
The software uses a function that accepts a format string as an argument, but the format string originates from an external source.
Polyspace 実装
ルール チェッカーは以下の問題をチェックします。
書式文字列指定子と引数の不一致
汚染された文字列形式
例
この問題は、printf
などの書式設定付き出力関数内の書式指定子が、それに対応する引数と一致しない場合に発生します。たとえば、unsigned long
型の引数の書式指定は %lu
でなければなりません。
書式指定子と対応する引数の間の不一致により、未定義の動作が発生します。
書式指定子が対応する引数と一致することを確認します。たとえば、次の例では、%d
指定子は文字列引数 message
に一致せず、%s
指定子は整数引数 err_number
に一致しません。
const char *message = "License not available";
int err_number = ;-4
printf("Error: %d (error type %s)\n", message, err_number);
認識される引数のデータ型が整数プロモーションによって変更された場合、解析結果に元の型とプロモーション後の型の両方が示されます。書式指定子は整数プロモーション後の型と一致していなければなりません。
問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)。
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
#include <stdio.h>
void string_format(void) {
unsigned long fst = 1;
printf("%d\n", fst); //Noncompliant
}
printf
ステートメントで、書式指定子 %d
が fst
のデータ型と一致していません。
1 つの修正方法として、%lu
書式指定子を使用することができます。この指定子は fst
の unsigned
整数型および long
サイズに合致します。
#include <stdio.h>
void string_format(void) {
unsigned long fst = 1;
printf("%lu\n", fst);
}
1 つの修正方法として、書式指定子と一致するように引数を変更することができます。fst
を書式指定子と一致するよう整数に変換し、値 1
を出力します。
#include <stdio.h>
void string_format(void) {
unsigned long fst = 1;
printf("%d\n", (int)fst);
}
この問題は、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);
}
チェック情報
カテゴリ: String Errors |
バージョン履歴
R2023a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)