对于C/C++来说,当人们说代码不安全时,这是否意味着应用程序将崩溃,或者它可能被滥用以发起网络攻击
For C/C++, when people say code is insecure, does it mean the application will crash, or it can be abused to launch cyber attack?
我在很多情况下看到过,人们说代码是";不安全";。
- 访问超出界限的数组是";不安全">
- 没有自由的马洛克是没有安全感的
- 摆动指针是";不安全">
- 无绑定检查用户输入是"无绑定";不安全">
在上面的例子中,我理解在第四种情况下,在特定的上下文下,例如,如果你正在编写代码以根据密码数据库检查用户输入,你的代码可能会被滥用,导致缓冲区溢出,并允许欺诈用户进行身份验证。然而,我不明白你的代码在其他情况下会被滥用,从而危及用户的计算机。
我能知道人们什么时候说";"不安全";,它们是否真的意味着你的程序可能会被攻击者滥用,或者你的程序会崩溃?
调用未定义的行为总是不安全的。第一项(数组访问边界(自动属于该类别。第四个只是第一个例子,以用户交互为条件(那些讨厌的用户(。也就是说,覆盖输入缓冲区的潜力具有调用未定义行为的潜力,因此是不安全的。
剩下中间两个。
未能释放动态内存最终将导致操作失败,因为操作系统(通常(会根据的规则而不是您的规则终止此类程序。这种情况何时以及如何发生并不令人担忧;它可以发生是一个大问题。这是";蹩脚代码";,而且对于安全问题具有的潜力。无论需要什么条件来重复泄漏,都只需要在极端偏见的情况下进行,直到操作系统拆除应用程序,这样你就完成了DoS(拒绝服务(。
挂起的指针只是UB在等待。它们是蹩脚代码中的更多成分。只是坐在那里,他们什么也不做。然而,当它们被取消引用时,它们为此类问题提供了机会。一旦发生,它就加入UB篮子中的第一个和第四个项目,并因此自动地"被";不安全";。当指针本身的值被视为其自身的状态时,也可能会出现问题,尽管这是高度情境化的,而且比简单的去引用工作流更罕见。
简短的答案是:所有UB自动不安全。在场的四件物品中有两件能立即放入篮子。在正确的使用条件下,第三种可能适合这个篮子。第四个(未能释放内存(是一个彻头彻尾的错误,它最终会导致进程终止,超出代码作者的权限,但如果可以利用它来促进DoS结论,则会得到增强。
简短的回答是:不要编写调用UB的代码,一般也不要编写糟糕的代码。
没有free
的malloc
和悬挂指针会导致内存泄漏。如果内存泄漏过多,将导致程序使用过多内存。如果它使用的内存太多,可能会崩溃,可能会因为其他应用程序无法获得所需的内存而导致系统性能问题,甚至可能导致系统耗尽虚拟内存。
这些类型的问题主要是服务器等长时间运行的应用程序所关心的问题。想象一下,一台服务器持续运行,每小时泄漏一兆字节。这是每40天一个千兆字节。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 地图计数确实很重要,或者只是检查是否存在