代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

37 | 边界,信任的分水岭

修复
漏洞
数据结构
原理
活跃状态
非可靠连接
守护
界定
重要概念
数据可信任性问题
代码分析
公开接口数据
外部输入数据
公开接口输出数据
公开接口输入数据
I/O输入数据
用户输入数据
外部数据
内部数据
数据合法性
安全编码原则
修复方法
漏洞原因
代码问题
心跳协议
计算机通信
信任的边界
信息安全
一起来动手
小结
哪些是外部数据?
信任的边界
案例分析
评审案例
边界
边界与信任的分水岭

该思维导图由 AI 生成,仅供参考

边界是信息安全里一个重要的概念。如果不能清晰地界定信任的边界,并且有效地守护好这个边界,那么编写安全的代码几乎就是一项不可能完成的任务。

评审案例

计算机之间的通信,尤其是建立在非可靠连接之上的通信,如果我们能够知道对方是否处于活跃状态,会大幅度地提升通信效率。在传输层安全通信的场景下,这种检测对方活跃状态的协议,叫做心跳协议。
心跳协议的基本原理,就是发起方给对方发送一段检测数据,如果对方能原封不动地把检测数据都送回,就证明对方处于活跃状态。
下面的数据结构,定义的就是包含检测数据的通信消息。
struct {
HeartbeatMessageType type;
uint16 payload_length;
opaque payload[HeartbeatMessage.payload_length];
opaque padding[padding_length];
} HeartbeatMessage;
其中,type 是一个字节,表明心跳检测的类型;payload_length 使用两个字节,定义的是检测数据的长度;payload 的字节数由 payload_length 确定,它携带的是检测数据;padding 是随机的填充数据,最少 16 个字节。
如果愿意回应心跳请求,接收方就拷贝检测数据(payload_length 和 payload),并把它封装在同样的数据结构里。
下面的这段代码(函数 process_heartbeat,为便于阅读,在源代码基础上有修改),就是接收方处理心跳请求的 C 语言代码。你能看出其中的问题吗?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过讨论心脏滴血漏洞(Heartbleed)案例,强调了在信息安全领域中界定信任边界和有效守护边界的重要性。文章指出,对外部数据合法性的严格检查和内存操作的安全性是关键。通过具体案例分析和修复过程,突出了修复前存在的安全隐患。文章强调了安全编码原则的重要性,以及对外部数据合法性的严格检查和内存操作的安全性。同时,还讨论了公开接口的输入和输出数据需要考虑可变量的传递带来的危害。总之,本文提出了外部数据的合法性问题是信息安全领域的一大类问题,也是安全攻击者经常利用的一类安全漏洞。文章以案例分析的方式,引导读者思考并加深对信息安全领域的理解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 彩色的沙漠
    malloc 开辟的空间可能包含释放了内存空间但是没有清除里面数据,所以里面的敏感信息有泄露的风险。释放内存空间的同时清空内存数据也是一个好习惯,避免很多不必要的麻烦

    作者回复: 是的,一个完整的方案要做到两个方面:清空敏感数据以及防范内存泄漏。

    2019-06-04
    8
  • 天佑
    老师,文件IO怎么也算外部数据呢?

    作者回复: 文件修改不在代码可以控制的范围里呀。

    2019-04-14
    2
  • DasonCheng
    作为开发人员,有哪些途径即时获取各种漏洞信息以便修补漏洞,避免损失呢?

    作者回复: 主要有:订阅相关的安全威胁情报,查看依赖软件的安全修复发布版,跟踪NIST提供的安全漏洞数据库。

    2019-06-13
    1
  • 空知
    之前的整数溢出也算是边界问题的一种吧

    作者回复: 是的。

    2019-04-01
    1
  • 天佑
    我看防御式编程会在边界处,专门构建一些类进行外部输入过滤,穿越进边界内不,可以完全信任,这在实际场景当中可操作性更强些吧,避免个人开发的遗漏。 另外,我看到有些例子对外部输入有标准化归一化处理,比如String normalized = Normalizer.normalize(xxx, Normalizer.Form.NFKC);道理也很好理解,觉得这样做会更好些,但是我咨询了开发,他们并不会经常用到,这是为什么,还是有特定场景才会使用?还有nfkc这玩意儿我一直没参透明白,希望老师解惑,谢谢。

    作者回复: 专门有一个过滤层,这种办法也能有作用,但是局限性很大。个例还可以,不是一个普遍的解决方案。 因为,在边界处,如果处理了所有的数据,过滤层就和内部的代码没什么重大区别;如果处理不了所有的数据,遗漏的数据还是不可信任。 就像我们文中边界那一部分的数据d一样。另外,加一层做所有的过滤损害效率,增大代码复杂度,破坏代码逻辑。我很少看到这种用法。如果过滤层能想到检查,没有过滤层,常规代码里也能做到。先想到,才能做到;想到了,怎么做就有很多选择了。 我也不懂NFKC是什么。

    2019-03-29
    1
  • cz
    公开接口输出的数据, 有个典型的例子, java.enum.values() // 为了避免输出的values array 被无意修改, jdk 的实现是每次都拷贝一个 array // 虽然性能上有点妥协, 但最大程度上保证了代码的正确性
    2022-01-26
    1
  • ifelse
    无法识别来源的数据,不应该是可信任的数据。--记下来
    2022-07-31归属地:浙江
  • 丁丁历险记
    涨了不少见识
    2019-10-15
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部