097 - 问,安全编码之字符串

097 - 问,安全编码之字符串

最近简单学习了《C和C++安全编码》第二章《字符串》,简要做个笔记。

1. 字符串不是C或C++的内建类型。

2. 主要原因为null结尾。

3. Std::basic_string相比C风格字符串,很少产生安全漏洞。

4. 有些字符串不一定以null结尾,例如:LSA_UNICODE_STRING 。

5. 无界字符串复制(unbounded string copy )

无界数据源 复制到 定长字符数组。

例如:

Char name[1024];

Strcpy(name,argv[1])

可以使用strlen及strdup缓解。

Cin一样。

通过设置cin.width缓解。

6. 差一错误(off-by-one error)

Char source[10];

For(int i = 1 ; i <=11; ++i){}

这个其实就是编程失误。

7. 空结尾错误(null termination error)

字符串结尾忘了设置null。

8. 字符串截断(string truncation)

丢失数据,也有可能产生漏洞。

9. 废弃的函数:strcpy, strcat,gets,streadd,strecpy,strtrns等。

10. 缓冲区溢出:向某特定数据结构分配的内存空间之外写入数据。

11. 栈粉碎:缓冲区溢出覆写了分配给执行栈内存中的数据。Stack段的缓冲区溢出使得攻击者能够修改自动变量的值或执行任意的代码。

12. 代码注入:函数返回地址被覆盖,结果指向恶意程序代码。

13. 被注入的恶意代码通常也被称为shellcode。

14. 弧注入(arc injection 或称为 return-into-libc):通过修改函数返回地址的方式改变程序的控制流程。

15. 最小特权策略:不需要某些特权的情况下主动去除那些权利。

16. 缓解策略:字符串有效性验证。

17. Fgets - > gets_s()

18. memcpy_s , memmove_s

19. strcpy_s , strcat_s

20. strncpy_s , strncat_s

21. strnlen_s

22. strsafe.h

23. SafeStr, Vstr,

24. fmemopen, open_memstream

25. Stackgap

26. canaries

27. StackGuard , SSP (Stack Smashing Protector)

28. 《Smashing the Stack for Fun and Profit》

29. 《Building Secure Software》

你可能感兴趣的:(097 - 问,安全编码之字符串)