Skip to content

G.SAF.UNS.01 禁止将外部可控数据作为加载动态库的参数

【级别】 要求

【描述】

禁止将从外部获取的数据作为加载动态库的参数,否则可能加载攻击者事先预制的模块。 如果要加载动态库,可以采用如下措施之一:

  • 使用白名单机制,确保加载函数的参数不受任何外来数据的影响。 使用数字签名机制保护要加载的动态库,充分保证其完整性。
  • 在设备本地加载的动态库通过权限与访问控制措施保证了本身安全性后,通过特定目录自动被程序 加载。
  • 在设备本地的配置文件通过权限与访问控制措施保证了本身安全性后,自动加载配置文件中指定的 动态库。

【反例】

示例参考: rust_libloading 例子

Rust
// 不符合
extern crate libloading; 
use std::io::Read;

fn main() {
  let mut f = std::fs::File::open("tests/nagisa64.txt").unwrap(); 
  let mut name = String::new();
  // 不符合:从不受信任的文件读取用于加载的动态库名称
  f.read_to_string(&mut name).unwrap();

  unsafe {
    let lib = libloading::Library::new(&name); 
    if lib.is_err() {
      println!("can't open {}", name); 
    }
  } 
}

【正例】

Rust
extern crate libloading; 
use std::ffi::OsStr;

fn main() -> Result<(), Box<dyn std::error::Error>> {
  fn whitelist_verify<P: AsRef<OsStr>>(lib_path: P) -> Result<bool, String> {
    // 检查传入路径是否在白名单内 // ......
    return Result::Ok(false); 
  }

  let name = "nagisa64.dll";
  if whitelist_verify(name).is_ok() { 
    return;
  }
  unsafe {
    let lib = libloading::Library::new(name); 
    if lib.is_err() {
      println!("can't open {}", name); 
    }
  } 
}