|
| 1 | +# 【Java】强化安全规则包-使用手册 |
| 2 | +针对 Java 语言的强化代码安全规则包,属于 TCA 增强分析模块的能力之一,请参考[增强分析模块部署](https://tencent.github.io/CodeAnalysis/zh/quickStarted/enhanceDeploy.html)文档进行部署。 |
| 3 | + |
| 4 | + |
| 5 | +## CmdInject |
| 6 | +### 概述 |
| 7 | +支持的语言:Java |
| 8 | + |
| 9 | +CmdInject 规则用于检查代码中是否存在[`命令行注入漏洞`](https://owasp.org/www-community/attacks/Command_Injection)。 |
| 10 | +当使用 childprocess 等模块执行命令时,拼接了用户可控的输入,会导致命令执行漏洞。攻击者利用漏洞可以控制目标主机或者容器。 |
| 11 | + |
| 12 | +### 示例 |
| 13 | +```java |
| 14 | +void bad(HttpServletRequest req, HttpServletResponse resp){ |
| 15 | + String cmd = req.getParameter("cmd"); |
| 16 | + Runtime rt = Runtime.getRuntime(); |
| 17 | + rt.exec(cmd); // 触发规则 |
| 18 | +} |
| 19 | +``` |
| 20 | + |
| 21 | +### 修复建议 |
| 22 | +需要评估 childprocess 等模块执行命令的使用,应限定或校验命令和参数的内容。 |
| 23 | + |
| 24 | +## PathTraversal |
| 25 | + |
| 26 | +### 概述 |
| 27 | +支持的语言:Java |
| 28 | + |
| 29 | +PathTraversal 规则用于检查代码中是否存在[`路径穿越漏洞`](https://owasp.org/www-community/attacks/Path_Traversal)。 |
| 30 | +操作文件时,应该限定文件的路径范围,如果拼接用户输入到文件路径,可能导致路径穿越漏洞。攻击者利用漏洞可以访问到文件系统上的任意文件,这可能导致信息泄漏等问题。 |
| 31 | + |
| 32 | +### 示例 |
| 33 | +```java |
| 34 | +void bad(HttpServletRequest req, HttpServletResponse resp){ |
| 35 | + String image = req.getParameter("image"); |
| 36 | + File file = new File("resources/images/", image); // 触发规则 |
| 37 | + |
| 38 | + if (!file.exists()) { |
| 39 | + return Response.status(Status.NOT_FOUND).build(); |
| 40 | + } |
| 41 | + |
| 42 | + return Response.ok().entity(new FileInputStream(file)).build(); |
| 43 | +} |
| 44 | +``` |
| 45 | + |
| 46 | +### 修复建议 |
| 47 | +按业务需求,使用白名单限定后缀范围,校验并限定文件路径范围。 |
| 48 | + |
| 49 | +## SQLInject |
| 50 | + |
| 51 | +### 概述 |
| 52 | +支持的语言:Java |
| 53 | + |
| 54 | +SQLInject 规则用于检查代码中是否存在[`SQL注入漏洞`](https://en.wikipedia.org/wiki/SQL_injection)。 |
| 55 | +错误的拼接用户可控的值到 sql 语句,可能导致 sql 注入漏洞。攻击者可以修改 sql 语法来更改查询的目标或结果,泄露数据库敏感信息,也可以使用SQL文件操作攻击底层Web服务器。如果使用该 sql 查询进行授权认证,攻击者还可以用于提权。 |
| 56 | + |
| 57 | +### 示例 |
| 58 | +```java |
| 59 | +void bad(HttpServletRequest req, HttpServletResponse resp){ |
| 60 | + String id = req.getParameter("id"); |
| 61 | + Connection conn = null; |
| 62 | + Statement statement = null; |
| 63 | + ResultSet rs = null; |
| 64 | + |
| 65 | + Class.forName("com.mysql.cj.jdbc.Driver"); |
| 66 | + conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/sec_sql", "root", "admin888"); |
| 67 | + String sql = "select * from userinfo where id = " + id; |
| 68 | + statement = conn.createStatement(); |
| 69 | + statement.executeUpdate(sql); // 触发规则 |
| 70 | +} |
| 71 | +``` |
| 72 | + |
| 73 | +### 修复建议 |
| 74 | +SQL 语句默认使用预编译并绑定变量,使用安全的ORM操作。 |
| 75 | + |
| 76 | +## SSRF |
| 77 | + |
| 78 | +### 概述 |
| 79 | +支持的语言:Java |
| 80 | + |
| 81 | +SSRF 规则用于检查代码中是否存在[`服务端请求伪造漏洞 SSRF(Server-side request forgery)`](https://en.wikipedia.org/wiki/Server-side_request_forgery)。 |
| 82 | +攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。 |
| 83 | + |
| 84 | +### 示例 |
| 85 | +```java |
| 86 | +import org.springframework.context.annotation.Configuration; |
| 87 | +import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
| 88 | +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
| 89 | +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
| 90 | + |
| 91 | +@EnableWebSecurity |
| 92 | +@Configuration |
| 93 | +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { |
| 94 | + @Override |
| 95 | + protected void configure(HttpSecurity http) throws Exception { |
| 96 | + http |
| 97 | + .csrf(csrf -> |
| 98 | + csrf.disable() // 触发规则 |
| 99 | + ); |
| 100 | + } |
| 101 | +} |
| 102 | +``` |
| 103 | + |
| 104 | +### 修复建议 |
| 105 | +限定访问网络资源地址范围,请求网络资源应加密传输。 |
| 106 | + |
| 107 | +## XSS |
| 108 | + |
| 109 | +### 概述 |
| 110 | +支持的语言:Java |
| 111 | + |
| 112 | +XSS 规则用于检查代码中是否存在[`跨站脚本攻击漏洞 XSS(Cross-site scripting)`](https://en.wikipedia.org/wiki/Cross-site_scripting)。 |
| 113 | +如果 web 页面在动态展示数据时使用了用户的输入内容,没有对输入的内容过滤或者进行转义,黑客可以通过参数传入恶意代码,当用户浏览该页面时恶意代码会被执行。 |
| 114 | + |
| 115 | +### 示例 |
| 116 | +```java |
| 117 | +void bad(HttpServletRequest req, HttpServletResponse resp){ |
| 118 | + String id = request.getParameter("id") != null ? request.getParameter("id") : "0"; |
| 119 | + Doc doc = getdetailsById(id); |
| 120 | + byte b[] = doc.getUploaded(); |
| 121 | + try { |
| 122 | + response.setContentType("APPLICATION/OCTET-STREAM"); |
| 123 | + String disHeader = "Attachment;Filename=" + doc.getName(); |
| 124 | + response.setHeader("Content-Disposition", disHeader); |
| 125 | + ServletOutputStream out = response.getOutputStream(); |
| 126 | + out.print(b); // 触发规则 |
| 127 | + } |
| 128 | +} |
| 129 | +``` |
| 130 | + |
| 131 | +### 修复建议 |
| 132 | + |
| 133 | +在输出所有用户可控的数据时, 对数据做转义或者编码。 |
0 commit comments