JAVA代码审计之安全编码问题

百家 作者:焦点安全应急响应中心 2020-09-27 18:49:16
前言

    “FSRC经验分享”系列文章,旨在分享焦点科技信息安全部工作过程中的经验总结,包括但不限于漏洞分析、运营技巧、sdl推行、等保合规、自研工具等等。

    欢迎各位安全从业者持续关注~ 


1什么是安全编码

    

    安全编码,简单来说就是不将关键参数硬编码在代码中,避免使用产生漏洞较多,被公认为是不安全的函数、加密算法。这是安全意识在JAVA开发工作中最直接的体现。

    这类问题在代码安全审计中较为容易发现,可通过全局搜索甚至自动化工具编写规则即可确定函数位置。接下来我们就分享一些代码审计中常见的安全编码问题。


2配置型硬编码密码

安全风险

   

硬编码用户名、密码、IP、DB链接信息等,若源代码泄露或者攻击者通过class文件反编译出源代码即可获取敏感信息,甚至直连数据库


代码示例

   
domain.password = "123123"
修复方案

   
将密码抽出统一放在配置文件中

3log记录敏感信息


安全风险

   

日志内记录敏感信息如账号密码,若日志信息泄露则会造成敏感信息泄露


代码示例

   
log.debug("username:" + username + " password:" + password);logger.info("AccountService.reg user.password is {} start in", user.getEmail());
修复方案

   
删除该代码,敏感信息不记录在日志中


4不安全的随机函数


安全风险

   

使用可预测的伪随机数生成函数会导致漏洞。若生成会话标记,那么可以预测下一个用户和前一个用户的会话标记进而劫持他们的会话。


代码示例

   
Random r = new Random();r.nextInt()
修复方案

   
建议使用java.security.SecureRandom替代java.util.Random

5RSA非对称加密密钥过短


安全风险

   

RSA算法安全系数取决于大素数分解的难度,求私钥的难度等价于分解两个大素数之积。密钥过短会降低RSA算法的安全性


代码示例

   
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); //基于RSA算法生成对象keyPairGen.initialize(256,new SecureRandom()); //密钥大小为96-4096位KeyPair keyPair = keyPairGen.generateKeyPair(); // 生成一个密钥对,保存在keyPair中RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));keyMap.put(0,publicKeyString); //0表示公钥keyMap.put(1,privateKeyString); //1表示私钥
修复方案

   
建议使用1024位以上的密钥长度


6不安全的DES加密算法


安全风险

   

DES和DESede (3DES)存在安全问题。DES密钥长度56位,较短,易遭受穷举攻击。3DES相当于有3个独立密钥的DES,密钥长度为168位,但实际上由于对特定的选择明文攻击和已知明文攻击的强度较弱,NIST认定它只有80位的安全性。


代码示例

   
Null
修复方案

   
建议使用AES加密算法

7不安全的ECB加密模式


安全风险

   

ECB(电子密码本)模式由于所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击


代码示例

   
Cipher c = Cipher.getInstance("AES/ECB/NoPadding");c.init(Cipher.ENCRYPT_MODE, k, iv);byte[] cipherText = c.doFinal(plainText);
修复方案

   
建议使用更安全的GCM模式

8免责声明


      本文中提到的相关资源已在网络公布,仅供研究学习使用,请遵守《网络安全法》等相关法律法规。


9参考资料


经验分享丨JAVA审计中常见的加密错误,你知道几个?(by 精通linux开关机)

https://zhuanlan.zhihu.com/p/135875501

Java安全编码实践总结(by 随便看看)

https://www.freebuf.com/vuls/240172.html



FSRC,愿与你共同成长
焦点科技漏洞提交网址:https://security.focuschina.com





关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接