SV.RVT.RETVAL_NOTTESTED

返回值被忽略

通过检查返回值来确保各项函数成功运行非常重要,因为忽略异常和错误条件可能让攻击者有机会引入意外行为。SV.RVT.RETVAL_NOTTESTED 检查器可为以下函数报告忽略的返回值代码:

函数 需检查的返回值
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 提供。