下面的系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解,该标准是2020年4月28日,由国家市场监督管理总局、国家标准化管理委员会发布,2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理,大家感兴趣的话可以自己去下载下来学习一下,里面有一些最佳实践是比较好的。
本标准从程序安全和环境安全两个方面提出了提升应用安全性的编程最佳实践。其中,程序安全部分描述软件在资源使用、代码实现、安全功能方面的安全性规范,环境安全部分描述软件的安全管理配置规范。前面的文章为大家介绍了程序安全,本文我们针对代码安全的并发程序安全部分进行解读。
【并发程序安全】
这一块是程序中经常出现的一些问题,我们在功能测试、性能测试中经常会遇到的一些问题。
1.确保共享数据的线程安全:
(1)确保所有的全局变量、线程间的共享可变数据是线程安全的。
(2)对所有需确保线程安全的数据通过同步方法或代码块进行保护。
2.确保共享变量、数据的可见性:
(1)对共享变量、数据的读或写操作均使用同步访问。
(2)所有执行读或写操作的线程都应在同一个锁上同步,以确保所有线程都能看到共享变量或数据的最新值。
比如一些订单的操作,在读和写的时候要上同一个锁,保证是一致的。一方读的时候对方正在写,导致读的是之前的信息,这样这个订单就容易产生一些交易上的问题。
3.需确保能够终止处于阻塞状态的任务和线程。
有些任务和线程处在阻塞状态我们可以及时阻止,我们要能够预见到什么程度下会出现阻塞,在程序上做一个防护,使其能够及时终止。
4.仅在循环体中执行线程的挂起操作,并在每次挂起线程之前检查线程继续执行要满足的条件。
5.不要在条件变量同步等待操作中使用多余一个互斥条件。
这部分并发程序安全在标准中也给出了最佳实践,大家也可以去看一看。
这里给大家举一个例子,有一个类,SimpleDateFormat(时间格式化),这个类就是线程不安全的,现在已经不建议使用了,在我们代码审计的过程中,这个类出现的频率还很高,很多单位和项目都还在用这个类。
这个类是线程不安全的,如果你非要用的话,就必须是局部变量的使用,这样性能会比较差。
在java8中有一个替代它的的类,DateTimeFormatter这个是线程安全的,可以替代SimpleDateFormat。我们在做项目的时候一定要用最新的、安全的一些类、方法和框架。
后面的文章会继续对《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》的其他部分进行解读,欢迎继续关注。