下面的系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解,该标准是2020年4月28日,由国家市场监督管理总局、国家标准化管理委员会发布,2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理,大家感兴趣的话可以自己去下载下来学习一下,里面有一些最佳实践是比较好的。
本标准从程序安全和环境安全两个方面提出了提升应用安全性的编程最佳实践。其中,程序安全部分描述软件在资源使用、代码实现、安全功能方面的安全性规范,环境安全部分描述软件的安全管理配置规范。前面的文章为大家介绍了程序安全,本文我们针对代码安全的面向对象程序安全部分进行解读。
代码安全的实现主要包括:面向对象程序安全、并发程序安全、函数调用安全、异常处理安全、指针安全、代码生成安全。
这几块对于开发人员来说都是经常遇到的,我们在代码审计的过程中也会经常遇到,这应该算是规范性的一些问题。经过不断的实践积累也可以形成一个代码的安全编程规范,让整个项目组按照这个规范进行编程,从源头上规避安全问题。
阿里巴巴也曾经发布过一个java的编程规范,写得非常详细,都能具体到使用哪一个类是比较安全的,大家感兴趣可以下载下来看一看。
【面向对象程序安全】
1.子类对基类的扩展需从以下角度进行安全控制:
(1)对基类的扩展,应保持由基类提供的不变性。
(2)对于关键基类仅允许受信任的子类进行扩展。
这条主要是针对java语言,主要是一个编程规范,这块我们也不展开说了,就是一个最基本的安全要求。
2.禁止返回类的私有可变成员的引用。可返回一个指向内部可变成员的防御性副本的引用,从而保护内部状态不会被非预期地修改。
这条是说类里面的私有可变成员尽量不要直接返回,尽量通过方法的方式返回一个副本,比如get、 set这些方式。给它赋个值,再返回来,不要直接返回成员变量。
3.对可变变量(或可变的内部对象)创建防御性副本:
(1)如果程序逻辑依赖可变变量,则需警惕竞态攻击。
(2)在需要访问可变变量(或可变的内部对象)时,可使用返回可变变量(或可变的内部对象)的封装器方法来实现。
4.当判定一个对象是否属于特定的类,或两个对象的类是否相同时,比较类对象,而非仅基于类名称进行判定。
因为类的名称有一些是可以被篡改的,黑客在攻击的时候会生成一个一样的类名,但是类的内容是不一样的,所以在比较的时候通过类的对象或类的方法进行比较。
后面的文章会继续对《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》的其他部分进行解读,欢迎继续关注。