1
您的位置: 线上活动  >  在线答题  >  答题题库

HLab-SW安全编程规范 考试

2023-02-28 11:42:04.226.0.17369

HLab-SW安全编程规范 考试 在线考试 答题题目
1、 一下代码段哪里不符合规范? int VerifyPassword(string password) { //内容省略 } int Func() { string password = GetPassword(); VerifyPassword(password); ... }
  • A、没传入password长度
  • B、用string类型存储敏感数据
  • C、没有加const修饰
  • D、没有足够的存储空间


  • 2、 下面描述错误的是?
  • A、断言只能在调试版使用,断言被触发后,程序会立即退出,因此严禁在正式发布版本使用断言,请通过编译选项进行控制。
  • B、严禁在断言中使用任何赋值、修改变量、资源操作、内存申请等操作
  • C、Linux下可以用rand函数产生用于安全用途的随机数
  • D、linux下可以用/dev/random生成用于安全用途的随机数


  • 3、 关于下面代码段的描述,错误的是? #include <string.h> #include <stdlib.h> #include <stdio.h> enum { BUFFERSIZE = 512 }; void func(const char *input) { char cmdbuf[BUFFERSIZE]; int len_wanted = snprintf(cmdbuf, BUFFERSIZE, "any_cmd '%s'", input); if (len_wanted >= BUFFERSIZE) { /* Handle error */ } else if (len_wanted < 0) { /* Handle error */ } else if (system(cmdbuf) == -1) { /* Handle error */ } }
  • A、如果指定了一个可执行程序的相对路径,并且攻击者可以控制当前工作目录
  • B、使用system()函数会导致可利用的漏洞,在最坏的情况下允许执行任意的系统命令
  • C、如果需要使用system(),要使用白名单机制校验其参数,确保函数的参数不受任何外来数据的命令注入影响
  • D、在这个代码例子中,system()函数被用来在主机环境中执行any_cmd,不会导致注入漏洞


  • 4、 下面代码段的描述,哪个不符合Hlab-SW安全编程规范? void host_lookup(char *user_supplied_addr) { struct hostent *hp; in_addr_t *addr; char hostname[64]; in_addr_t inet_addr(const char *cp); /* routine that ensures user_supplied_addr is in the right format for conversion */ validate_addr_form(user_supplied_addr); addr = inet_addr(user_supplied_addr); hp = gethostbyaddr(addr, sizeof(struct in_addr), AF_INET); strcpy(hostname, hp->h_name); }
  • A、禁止读取或写入缓冲区预期边界之外的内存位置
  • B、这个函数分配了一段64Byte的buffer用来存储hostname,但是无法保证hostname会不会超过64Byte长度限制
  • C、攻击者可以想办法构造一个很长的hostname用来摧毁系统,或者一些实际中存在的hostname过长的网络场景下会导致该函数产生不可预知的行为
  • D、指针变量可以不在声明中初始化


  • 5、 下面关于realloc()函数的描述,错误的是?
  • A、随着参数的不同,其行为也是不同
  • B、一个简单函数,却被赋予了3种行为,这不是一个设计良好的函数
  • C、此函数在编码中提供了便利性,应当多加利用
  • D、虽然在编码中提供了一些便利性,但是却极易引发各种bug


  • 6、 悬挂指针可能会导致双重释放(double-free)以及访问已释放内存的危险。关于悬空指针的描述错误的是?
  • A、C语言的free()函数最后会自己把指针指向NULL
  • B、消除悬挂指针以及消除众多与内存相关危险的一个最为有效地方法就是当指针使用完后将其置新值
  • C、如果一个指针释放后能够马上离开作用域,因为它已经不能被再次访问,因此可以无需对其赋予新值
  • D、进入已经被内存管理函数取消分配的内存是未定义行为


  • 7、 下面哪个POSIX接口函数不能在信号处理程序中调用?
  • A、fork()
  • B、wait()
  • C、malloc()
  • D、write()


  • 8、 下面关于“禁止引用未初始化的内存”规则的描述正确的是?
  • A、系统会自动初始化,额外初始化多此一举
  • B、malloc、new分配出来的内存没有被初始化为0,要确保内存被引用前是被初始化的
  • C、calloc()函数分配的内存不会初始化为0,因此可以不用再额外初始化
  • D、aligned_alloc()函数分配的内存会初始化为0,因此需要在使用前初始化


  • 9、 关于“内存分配后必须判断是否成功”规则描述正确的是?
  • A、C语言的内存分配函数会保证成功,不需要检查
  • B、C++的new()方法会保证分配内存成功,不需要检查
  • C、那些不能检查和正确处理内存分配失败的程序将有未定义的行为,并有可能在堆空间耗尽时崩溃
  • D、仅仅检查和处理内存分配失败可能是不够的,但不检查依旧是必要的


  • 10、 在编程时遇到内存申请,Hlab人应该怎么做?
  • A、内存申请的大小可能来自于外部数据,必须检查其合法性,防止过多地、非法地申请内存
  • B、不能申请0长度的内存
  • C、确保存储空间足够且不浪费
  • D、以上都对


  • 11、(多选题) 关于下面打开文件的操作正确的是: char *fileName = GetMsgFromRemote(); ... sprintf_s(untrustPath, sizeof(untrustPath), "/tmp/%s", fileName); char *text = ReadFileContent(untrustPath); int fd = open(fileName, O_CREAT | O_WRONLY);
  • A、符合HLAB安全编程规范
  • B、没有显式指定合适访问权限,可能会让未经授权的用户访问该文件
  • C、当文件路径来自外部数据时,需要先将文件路径规范化
  • D、在此程序中,使用相对路径可能导致一些安全风险,例如DLL、EXE劫持等问题。


  • 12、(多选题) 以下是经过修改的网络设备收包处理流程代码,其中违背了哪些安全编程规则? void *__netdev_alloc_frag_align(unsigned int fragsz, unsigned int align_mask) { void *data; fragsz = SKB_DATA_ALIGN(fragsz); if (in_hardirq() || irqs_disabled()) { struct page_frag_cache *nc = this_cpu_ptr(&netdev_alloc_cache); data = page_frag_alloc_align(nc, fragsz, GFP_ATOMIC, align_mask); if (data == NULL) { schedule(); } } else if (in_softirq()) { delay(); } else { struct napi_alloc_cache *nc; local_bh_disable(); nc = this_cpu_ptr(&napi_alloc_cache); data = page_frag_alloc_align(&nc->page, fragsz, GFP_ATOMIC, align_mask); local_bh_enable(); } return data; }
  • A、中断上下文不能发生调度
  • B、中断上下文不能睡眠
  • C、禁止在信号处理程序中调用非异步安全函数
  • D、中断上下文不能有耗时操作


  • 13、(多选题) 关于下面代码,描述正确的是: char *log_message; void Handler(int signum) { syslog(LOG_NOTICE, "%s\n", log_m_essage); free(log_message); sleep(10); exit(0); } int main (int argc, char* argv[]) { log_message = strdup(argv[1]); signal(SIGHUP, Handler); signal(SIGTERM, Handler); sleep(10); }
  • A、当在信号处理程序中调用`free`时,通常会出现另一个信号争用条件,从而导致双重释放
  • B、指针释放后没有赋新值或NULL
  • C、在信号处理例程中如果调用非异步安全函数,可能会导致函数的执行不符合预期的结果。
  • D、为多个信号设置了相同的信号处理程序,但信号处理程序中调用了不可重入的函数free()


  • 14、(多选题) 对字符串或数组进行操作时,下面哪些描述是符合安全规范的?
  • A、调用格式化函数时,禁止format参数由外部可控
  • B、外部输入作为内存操作相关函数的复制长度时,需要校验其合法性
  • C、外部数据作为数组索引时必须确保在数组大小范围内
  • D、对字符串进行存储操作,必须确保字符串有’\0’结束符,否则在后续的调用strlen等操作中,可能会导致内存越界访问漏洞


  • 15、(多选题) 线程是调度的最小单元。下面对进程线程的操作不符合规范的是?
  • A、在线程内主动终止自身线程
  • B、线程函数在执行完毕后会自动、安全地退出
  • C、调用kill函数终止其他进程
  • D、进程间通信时,应该主动发送一个停止命令,通知对方进程安全退出


  • 16、(多选题) 下面对C++类的操作哪些是不符合规范要求的?
  • A、异常机制能很好阻止错误传播,鼓励使用
  • B、"delete this;"语句用起来方便省事又安全,可以多用
  • C、构造函数内完成对成员变量的初始化工作,也可以创建线程
  • D、构造函数没有返回值,不需要做错误判断,因此在构造函数内有可能失败的操作只能忽略


  • 17、(多选题) 对下面代码的描述,正确的是? void OsTask() { ... while (true) { msgHdl = receive(OS_WAIT_FOREVER, &msgId, &senderPid); if (msgHdl == 0) { continue; } switch (msgId) { ... } (void)free(msgHdl); msgHdl = NULL; } }
  • A、任何循环都必须有退出条件
  • B、嵌入式设备的操作系统或主流程,可能使用无限循环,允许“死循环”
  • C、这是“循环必须有退出条件“的例外情况
  • D、循环如果没有退出条件,那么程序无法安全退出


  • 18、(多选题) 对下面代码的评价符合安全规范的是? char *message; ... if (condition) { message = (char *)malloc(len); ... } ... if (message != NULL) {  memset (message, 0, sizeof(message));  ... free(message); }
  • A、如果condition未满足,会造成free未初始化的内存导致系统有崩溃风险
  • B、将指针当做数组进行sizeof操作,可能导致实际的执行结果与预期不符
  • C、编译器会自动将message初始化为NULL
  • D、资源释放后,对应的变量应该立即赋予新值,防止后续又被重新引用


  • 19、(多选题) 下面的代码,存在哪些风险? #define MAX_BUFF 0x1000000 int Foo(void) { int buff[MAX_BUFF] = {0};  size_t width = ReadByte(); size_t height = ReadByte();  size_t a = ReadByte(); size_t total = width * height; void *bitmaps = (void *)malloc(total);  size_t b = 1000 / a;  size_t c = 1000 % a; ... //省略后续处理 }
  • A、申请过大的静态数组,可能导致栈溢出
  • B、可能整数溢出
  • C、可能出现整数除0风险
  • D、后续处理没有交代,不完整无法判断


  • 20、(多选题) Hlab-SW对整数编程的要求有哪些?
  • A、整数之间运算时必须严格检查,确保不会出现溢出、反转、除0
  • B、整型表达式比较或赋值为一种更大类型之前必须用这种更大类型对它进行求值
  • C、禁止对有符号整数进行位操作符运算
  • D、禁止整数与指针间的互相转化


  • 微信扫一扫 在线答题 在线出卷 随机出题小程序 闯关答题软件 出题答题小程序