SV.RVT.RETVAL_NOTTESTED
戻り値の無視
戻り値をチェックして、関数が正常に実行されたことを確認することが重要です。これは、例外とエラー状況を無視すると、予期しない動作を攻撃者がもたらす可能性があるからです。SV.RVT.RETVAL_NOTTESTED チェッカーは、次の関数について無視された戻り値コードを報告します。
function | チェック対象の戻り値 |
---|---|
socket | -1、0 |
recv | 0、-1 |
pthread_mutex_destroy | 0 |
pthread_mutex_lock | 0 |
pthread_mutex_trylock | 0 |
pthread_mutex_unlock | 0 |
pthread_mutex_timedlock | 0 |
pthread_mutex_getprioceiling | 0 |
pthread_mutex_setprioceiling | 0 |
pthread_cond_init | 0 |
pthread_cond_destroy | 0 |
pthread_cond_wait | 0 |
pthread_cond_timedwait | 0 |
pthread_cond_broadcast | 0 |
pthread_rwlock_init | 0 |
pthread_rwlock_destroy | 0 |
pthread_rwlock_rdlock | 0 |
pthread_rwlock_tryrdlock | 0 |
pthread_rwlock_timedrdlock | 0 |
pthread_rwlock_wrlock | 0 |
pthread_rwlock_trywrlock | 0 |
pthread_rwlock_timedwrlock | 0 |
pthread_rwlock_unlock | 0 |
pthread_rwlockattr_init | 0 |
pthread_rwlockattr_destroy | 0 |
pthread_spin_init | 0 |
pthread_spin_destroy | 0 |
pthread_spin_lock | 0 |
pthread_spin_trylock | 0 |
pthread_spin_unlock | 0 |
pthread_barrier_init | 0 |
pthread_barrier_destroy | 0 |
脆弱性とリスク
これらの脆弱性は通常、頻繁には発生しないと思われる異常または例外的状況がないかをソフトウェアがチェックしないときに発生します。ところが、攻撃者はこれらの状況を利用して異常なアクションを引き起こし、不安定性、異常な動作、または脆弱性をもたらします。攻撃がない場合でも、戻り値がチェックされないと、操作で不良データが使用される可能性があります。その結果、不正確なプログラムフロー、データ整合性違反、またはアプリケーション障害につながる可能性が高くなります。
軽減と防止
戻り値検証と例外ケースを処理するコードを追加して、異常または例外的状況をチェックし処理する仕組みを確保してください。例外がコードによって確実に処理されるようにするため、エラー状況を特定してください。 そのためには、プログラムを低メモリ状況または権限が不十分な状況で実行するか、トランザクションを中断するか、ネットワークサービスへの接続を無効にします。
脆弱コード例
コピー
#include <pthread.h>
int foo() {
pthread_cond_t cond;
int res;
res = pthread_cond_init(&cond, NULL);
return 0;
}
Klocwork は 6 行目で指摘レポートを生成し、'pthread_cond_init' の戻り値が 0 と比較されないことを示します。戻り値がチェックされないと、予期しないプログラム動作が発生する可能性があります。
修正コード例
コピー
#include <pthread.h>
int foo() {
pthread_cond_t cond;
int res;
res = pthread_cond_init(&cond, NULL);
if (res != 0) return 1;
return 0;
}
修正された例では、7 行目で戻り値のチェックが行われます。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。