软件开发过程中常见漏洞的解析

28 篇文章 2 订阅

理论基础

更多安全文章可以关注公众号:小道安全

漏洞可以定义为“在软件和硬件组件中发现的计算逻辑(例如代码)中的弱点,当被利用时,会对机密性,完整性或可用性产生负面影响”。

软件漏洞是信息安全系统漏洞的重要组成部分,它通常被认为是软件生命周期中出现的设计错误、编码缺陷和运行故障造成的。

软件漏洞从产生、发现、解决这些维度它可以分为:

1、0 day漏洞:表示已经被发现,但未被公开还未发布补丁的漏洞;

2、1 day漏洞:表示厂商已经发现并公开了相关补丁,但由于部分用户还未及时打补丁,这个漏洞还是具有可利用性;

3、历史漏洞:这个漏洞的补丁发布时间很久,不可利用的漏洞。

软件漏洞的等级划分:

1、低级漏洞:这里漏洞利用非常困难或影响很小;

2、中等漏洞:这类漏洞由于默认配置、审核或利用难度等因素大大减轻了其影响;

3、重要漏洞:利用此类漏洞可能会危及用户数据的机密性、完整性或可用性,或者危及处理资源的完整性或可用性;

4、严重漏洞:利用此类漏洞,Internet病毒不需要用户操作就可以扩散。

软件漏洞基于成因可分类:内存破坏类漏洞、逻辑错误类漏洞、输入验证类漏洞、设计错误类漏洞、配置错误类漏洞。

缓冲区漏洞

当程序尝试读取或写入超出范围的缓冲区时,会发生缓冲区溢出。它可能导致覆盖或追加现有代码中的数据。

缓冲区溢出使攻击者能够执行代码、更改程序流程、读取敏感数据或使系统崩溃。包含缓冲区溢出漏洞通常发生在体系结构和设计、实现或操作阶段。

这个缓冲区漏洞最常发生在 C、C++的开发的程序中,但也可能发生在缺少内存管理支持的任何语言中。

缓冲区根据溢出的内存类型可以分为:栈内的数据溢出和堆内的数据溢出。

缓冲区漏洞被攻击者利用通常可以进行远程代码执行的功能。

导致出现缓冲区溢出漏洞问题点:

1、接受不受限制长度的输入

2、允许对来自无效索引的数组执行读取操作。

下面是出现缓冲区漏洞的例子:

上面代码从str向buffer复制数据,当str长度超过16时,就会出现缓冲区溢出。

问题根源在于strcpy没有限制复制数据长度,存在类似的问题还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。建议可以采用安全的系统函数(对操作数据进行长度判断的函数)例如strcpy_s

降低缓冲区漏洞方案

若要防止利用缓冲区溢出漏洞,可以使用包含功能或扩展的编译器来限制输入。

还有确保正确分配缓冲区空间,并且能够对输入的数据进行做限制和校验输入大小的方法和函数。

“防止利用缓冲区溢出漏洞的最佳方法之一是在软件投入使用之前从源代码中检测并消除它们”。

编码过程中,安全函数的使用可以降低缓冲区溢出的漏洞。

可以学习下华为开源的安全函数库,以此提高编码过程中的安全性,从而降低开发出一些漏洞的代码。

https://gitee.com/openarkcompiler/OpenArkCompiler/tree/master/src/mapleall/huawei_secure_c/src

字符串漏洞

在C、C++编程语言中正确和准确地操作Strings 时,必须考虑到 String 是以 null 结尾的字符序列。

对该 String 表示的不精确理解通常会导致一些最常见的错误:无界字符串副本、off-by-one 错误、空终止错误和字符串截断。

下面代码段展示了未绑定字符串副本的案例。该程序准备从标准输入(stdin)接收最多八个字符。然而,使用函数 gets() 并不能限制用户输入的字符数。攻击者可以通过输入8个以上的字符并将其传递给程序来探索此问题。

由于在这种情况下空终止符是重叠的,因此程序未分配的其他内存位置用于存储可能导致程序出现意外行为的额外字符。

在这类型的编码中,建议更改fgets函数的使用来直接缓解。该替代函数“最多将少于指定数量的字符从流读取到数组中”。

下面也是一个漏洞例子,其中发生了一个偏差错误。与未绑定的字符串副本一样,逐个错误与写入字符串边界外的字符有关。

在此类问题中,长度为 10 的字符串正确存储在准确定义了存储容量的变量源中。该漏洞始于字符串dest的内存分配。此操作使用函数strlen来计算字符串的字符数,直到找到空终止符。因此,并没有为dest字符串保留负责指示字符串终止的字符的位置。

由于将字符从字符串源复制到字符串dest的循环从位置 1 开始,因此最后一个命令将零字符写入字符串dest 的边界之外。

上面的问题点,可以通过在字符串分配期间考虑空终止符的位置并调整为负责字符复制的循环定义的索引来修复。

整数漏洞

当计算尝试递增一个大于用于在相关表示形式中存储该整数的整数值时,存在整数溢出漏洞。发生此错误时,整数值可能会转换为负数或非常小的数字。

当计算结果用于处理控制循环,确定行为(如复制,内存分配,串联等)的大小或偏移量并做出决定时,此弱点变得安全至关重要。

整数操作中的大多数错误和漏洞都涉及对存储此类型数据的变量进行限制检查不足。

下面的代码显示了由不精确的类型转换生成的常见错误。

尽管该函数检查通知的 size参数值是否符合最大数组大小的限制,但没有与参数值的信号相关的检查。因此,传递给函数的负大小将被视为它允许的大小,并且malloc 函数将使用负值调用。由于malloc期望size_t类型的参数,它将大小值转换为较大的无符号数字,这可能导致值大于MAX_ARRAY_SIZE中定义的值。

不正确的权限或身份验证漏洞

当未正确分配、跟踪、修改或验证用户特权和凭据时,会发生不正确的特权或身份验证。这些漏洞可能使攻击者能够滥用权限、执行受限任务或访问受限数据。

权限或身份验证不当的示例包括:

1、未撤消的临时权限提升。

2、通过列入黑名单而不是白名单来限制权限。

3、允许较低权限级别影响较高权限的帐户,例如重置管理员密码。

4、不受限制的登录尝试或会话限制。

特权或身份验证漏洞通常在开发的体系结构和设计、实现或操作阶段引入。任何语言都可能出现这些漏洞。

权限不当或身份验证的漏洞预防措施
应该将最小特权原则应用于与你的软件和系统交互的所有用户和服务。通过在整个程序和环境中应用访问控制来限制用户和实体功能。应将权限限制为用户或服务所需的那些资源。

如果可能,请将高级权限分为多个角色。分离有助于限制“高级用户”,并降低攻击者滥用访问权限的能力。这样还可以应用多重身份验证方法,以防止攻击者绕过系统或轻松访问。

小结

软件漏洞似乎不可避免,但大多数漏洞可以被消除或至少减少,只有通过细致的软件设计,良好的编码,发现漏洞后快速的响应来尽量减少软件漏洞的产生,以及降低漏洞被利用后所带来的危害。

同时为了提高软件的安全性减少漏洞的出现,做好代码审计,并且对软件进行做静态和动态运行时测试代码,以确保软件在发布前能够发现漏洞,解决漏洞。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在工作和生活,当您用手机登录网站、邮箱、聊天工具及网络游戏时,是不是偶尔会因为遗忘或记混用户名、密码而烦恼呢?当然,通常这些地方都会提供贴心的登录信息记忆功能来方便您的使用,可您有没有想过,万一不慎遗失了手机那捡到它的并怀有恶意的人也会因此而轻松使用本来只属于您的东西呢?另外,不同的地方对用户名和密码的长度、组成等一般会有不同的要求,所以需要您编出若干有个性、强度高还得好记的用户名、密码并在使用时正确无误的输入它们,怎么样,这活儿想想都头疼了吧?也许您会说编一个稍微简单点儿的在多数地方都能通用的用户名、密码不就行了,其实这种做法的风险是最高的,强度的降低会导致更快的被破解,而且只要有一个地方的帐号信息被窃取了那么您其他地方的帐号安全措施也就形同虚设了。 为了彻底解决上述的麻烦,『密码管家』诞生了!它主要具有以下几大功能:一是能将您的全部帐号信息分类记录并加密保存,您只需输入自定义的高强度的登录密码后即可查看;二是可自动生成任意长度和组成的新密码,您再不用浪费脑细胞去编了;三是轻轻摇晃手机便可将指定帐号信息快速输入到任何程序里,用户名、密码再长再复杂也不是问题,彻底告别费力的手动输入;四是利用方便的收藏和搜索功能您可在最短的时间内从众多记录找到需要的那个;五是在简单而灵活的排序功能的帮助下,您可以随意调整列表记录的顺序;六是通过‘导出和导入’功能可以将全部记录在加密后导出到储存卡或从储存卡导入您以前备份过的记录;七是特有的定时自动锁功能会在您停止操作一定时间后自动锁定密码管家,最大限度保护您的信息安全。 有了『密码管家』的协助,任何与密码相关的难题都是浮云,一切尽在您的轻松掌握! 【版本】v3.0.0 免费版 【支持终端】Android 1.6及以上 【屏幕适配】320x480,480x800,480x854,720x1280 【软件MD5】25A3526F13A2E25EAADD38223D861ABF 【更新历史】 ----- 2013.09.19 v3.0.0 ----- [除错] 1. 修正了当修改记录时信息输入框的高度显示不统一的问题。 2. 修正了当删除记录时提示框的文字换行显示异常的问题。 [改进] 1. 重写了界面适配部分的程序逻辑,从而在更多屏幕分辨率和屏幕密度不同的终端上正确显示。 2. 为配合上一步的修改重新设计制作了全部的图片资源。 3. 根据反馈将默认密码等新用户找不到的信息调整到了更醒目的位置。 4. 记录列表的弹出菜单会根据列表的记录数来变更其显示内容,使菜单操作更加友好。 [新增] 1. 增加对720x1280屏幕分辨率的支持。 2. 软件启动后先显示介绍页面,让新用户对密码管家的能力有一个大致的了解。 3. 用户首次进入登录、帮助、关于和记录列表等界面时会弹出操作图示,让新用户不再感到迷茫。 ----- 2012.02.01 v2.5.0 ----- [除错] 1. 修正了在某些HTC手机上出现的使用‘导出和导入’功能时文件列表无法滚动或滚动不畅的问题。 2. 修正了在开启了快速输入功能后,利用收藏、搜索功能跳转至其他记录时或者减少以及清空当前记录列表的记录时会导致输入内容错误甚至程序异常退出的问题。 3. 修正了先清空当前列表全部记录后再新建记录时新记录无法查看并进而导致程序异常退出的问题。 [改进] 1. 在登录密码输入和记录搜索两个界面自动弹出软键盘以简化操作步骤。 2. 使用导入功能时,增加对备份文件后缀名的判断以更快的校验其合法性,此外将后缀名由.db改为.pdb以更好的区别于其他文件。 3. 对执行删除记录列表记录的操作时蓝色高亮条的位置变化进行了调整使之更智能更符合操作习惯。 4. 使用导出功能时,输入的登录密码和文件密码不再明文显示而改为星号显示以加强保密性。 5. 使用更改或找回主密码功能时,输入的提示问题答案不再明文显示而改为星号显示以加强保密性。 6. 为更好适应不同的使用需求,将自动锁功能的时间设定上限改为60分钟(初始值改为10分钟),将快速输入功能的开启时限改为2分钟。 [新增] 1. 以手动方式对记录列表的记录进行排序,所要做的仅仅只是一拖一放这么简单。 ----- 2011.12.08 v2.0.0 ----- [除错] 1. 修正了进入设置、帮助和关于等界面时标题可能会错误显示为‘登录’的问题。 2. 修正了在记录内容查看界面划屏翻页操作无效的问题。 3. 修正了在密码自动生成界面生成长密码时会导致界面显示错乱的问题。 [改进] 1. 对程序图片进行优化以减少安装包大小并提高运行效率,重写帮助文档以更好的阐述应用的特点和功能。 2. 在执行登录或导出导入操作时,密码输入框内的密码不再明文显示而改为星号显示以加强保密性。 3. 对程序所有划屏操作的滑动方向进行调整使之符合大多数人的操作习惯,另外让各种弹出菜单在被点选后自动关闭以方便后续新操作的执行。 4. 为配合新增的快速输入功能以及进一步简化用户的操作,在来电或切换到其他程序时密码管家不再主动锁定自己。当然这不会降低安全性,因为自动锁功能仍会在预定时间到达后自动锁定密码管家。 5. 为配合新增的收藏功能,在每个记录列表将不再允许有相同名称的记录存在。 6. 为‘导出和导入’功能的储存卡浏览器增加目录的进出位置记忆以极大改善操作体验。 7. 将系统设定的‘开机显示通知栏图标’改为‘开机启动’和‘显示图标’两个独立选项,增加定制的灵活性。 [新增] 1. 选定一个记录后,只需轻摇手机即可复制用户名或密码到剪贴板,再粘贴到其他程序使用。 2. 记录收藏夹,可将最常用的记录置于其实现快速访问。 3. 记录搜索,输入部分或全部的记录名称作为关键字即可进行快速查找及访问。 ----- 2011.10.12 v1.5.0 ----- [重要更新] 1. 为导出的备份文件增加了文件密码保护,别人即便获得了您的备份文件在不知道密码的情况下也无法导入。 [除错] 1. 修正了在任意密码分类目录下建立并保存一个用户名和密码都为空白的记录会导致下次启动并查看此目录时程序异常退出的问题。 [改进] 1. 对说明文字及程序图片进行一定的润色和调整。 2. 对备份文件的导入功能进行优化,极大的提高了文件合法性校验时的准确性和效率。 3. 为名称过长的记录增加了文字滚动效果,方便用户看清全部内容。 4. 改进了记录列表的翻页方式,将较难的划屏操作改为了屏幕内方向箭头的点击。 5. 为记录列表增加了页码显示。 6. 对'自动生成密码'页面的布局进行了调整,查看结果预览条时再不用先上下拖动屏幕了。 7. 对自动生成密码的算法进行了调整,使结果更加准确和合理。 [新增] 1. 开机显示通知栏图标开关,方便用户通过它来快速访问密码管家。 ----- 2011.08.26 v1.0.0 ----- 首次发布。 【升级指南】 ----- 2013.09.19 v3.0.0 ----- 1. 旧版用户通过覆盖安装即可升级至最新版。 ----- 2012.02.01 v2.5.0 ----- 1. 旧版用户通过覆盖安装即可升级至最新版,由于v2.5.0的备份文件名有所变化,所以请将之前导出的备份文件名里的.db改为.pdb。 ----- 2011.12.08 v2.0.0 ----- 1. 由于v2.0.0新增了密码收藏功能并禁止了记录列表里存在同名记录,使数据库结构有稍许变化,只是覆盖升级的话会造成新版运行出现异常,所以强烈建议旧版用户在升级时采用全新安装的方式,提供步骤如下:首先确保密码管家内的记录是最新、最完整的(如不是请从您的备份文件导入),然后请将每个记录列表内存在的同名记录改名区分(没有则跳过此步),接着执行一次导出操作,最后卸载并重新安装密码管家再将上一步导出的记录导入即可。新用户不用遵循上述操作,直接安装v2.0.0即可。 ----- 2011.10.12 v1.5.0 ----- 1. v1.5.0包含一个重要更新和严重Bug的修正,强烈建议在使用v1.0.0的机友升级。由于备份文件增加了密码校验功能导致新版密码管家不能导入旧版的备份文件,所以请您按照如下步骤升级:首先确保v1.0.0密码管家内的记录是最新、最完整的(如不是请从您的旧版备份文件导入),然后不要卸载v1.0.0而是直接覆盖安装v1.5.0,完成后再执行一次导出操作并保存好备份文件即可。新用户不用遵循上述操作,直接安装v1.5.0即可。 2. 从v1.5.0开始将不再支持Android 1.5版的手机,因为后续要实现的功能必须Android 1.6以上才行,所以还望在用Android 1.5版手机的机友见谅。 【疑问解答】 1. 为什么会访问网络,会不会偷偷上传用户的账户记录信息? 会访问网络是由于嵌入了第三方的广告SDK,密码管家自身是不会有联网操作的。至于会不会偷偷上传用户的账户记录,我们郑重声明绝对不会,而且将来也不打算开发云储存这类的功能,因为信息只有保存在本地保存在自己手里才是相对最安全的。另外嵌入的广告SDK也不可能访问到密码管家的内部加密数据。当然,说到底最终的选择权还是在用户手,时间会证明一切的。 2. 安装时为什么显示要使用很多的权限? 实际上密码管家自身只请求了两个权限,开机启动权限(开机时自动运行)和存储卡读写权限(导出和导入),别的权限皆为嵌入的广告SDK所要求使用的。 【特别建议】 1. 无论是新用户还是老用户,请务必在成功安装了新版的密码管家后花上2,3分钟时间查看软件帮助,全面了解一下软件的功能和操作方法,这样有利于您在更短的时间内熟练掌握密码管家的全部本领。 2. 遇到软件使用方面的困难时,请您先查看软件帮助有没有相应的提示,如果仍不能解决的话请按照软件关于的联系方式联络我们,我们会在第一时间给予您协助。 【付费版本】 在试用过免费版后,如果您觉得密码管家还不错,想继续使用并获得更好的用户体验,不妨尝试选择付费版。相较于免费版,付费版有如下优势: 1. 清爽的界面没有任何广告,不再消耗您宝贵的网络流量,您也不用再担心账户信息会不会被偷偷上传了。 2. 一目了然的安全保证,安装软件时不再请求一些敏感功能的权限,您也不用再担心个人隐私信息被泄露了。 3. 毫无疑问的更加节省电力。 有意购买的话请按照软件关于的联系方式联络我们^^

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小道安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值