防范服务器端请求伪造 (SSRF)
什么是 SSRF?
服务器端请求伪造 (SSRF) 漏洞允许攻击者从易受攻击的 Web 应用程序的后端服务器发送精心构造的请求。犯罪分子通常利用 SSRF 攻击来针对防火墙后方且无法从外部网络访问的内部系统。
当攻击者对后端应用程序发送的请求拥有完全或部分控制权时,就会出现 SSRF 漏洞。SSRF 不限于 HTTP 协议。通常,攻击者控制的输入是 HTTP,但后端请求可以使用不同的协议。
您可以在 Snyk 的此交互式课程中练习攻击易受攻击的应用程序并了解缓解措施。
为什么 SSRF 攻击与 Neo4j 生态系统相关
Neo4j 是一个用于分析数据的图数据库。为了方便用户轻松导入现有数据,我们必须提供通过本地或网络 HTTP 加载文件(通常是 CSV 文件)的方式。此功能也可能被恶意用户利用,从而操纵初始请求——这是 SSRF 的第一步。
如何保护我的环境
鉴于 SSRF 是 OWASP 十大漏洞之一,OWASP 提供了全面的预防和缓解指南。
“用户应能从互联网上的任何位置加载数据”的用例属于案例 2,防御起来更为复杂。
但通过纵深防御方法,这是可能实现的。
Neo4j 尽可能进行输入验证,这是您的应用层防御。如果您在 Neo4j 之上构建自定义应用程序,最好将上传数据和运行原始 Cypher 查询的能力限制给您的认证用户。但为了确保纵深防御,您应该在网络层做更多工作。
检测和预防高度依赖于您的基础设施和网络环境。
在 AWS 云上运行
使用 IMDSv2。
在 Google Cloud 上运行
Google 提供了关于防止访问元数据、Compute Engine 资源以及如何利用工作负载身份最小化访问的建议。
配置选项
除了上述外部网络级限制机制外,Neo4j 还具有一个内部控制机制,允许用户提供 IP 地址范围供 DBMS 阻止。此控制通过一个配置设置激活,该设置必须添加到 neo4j.conf 中,并需要重启 DBMS 才能生效。
unsupported.dbms.cypher_ip_blocklist
描述 |
DBMS 用于阻止 IP 请求的 IP 地址范围 |
有效值 |
以逗号分隔的 IPv4 和 IPv6 CIDR 表示法 IP 范围列表 |
默认值 |
当 DBMS 尝试向 URL 发送 IP 请求时,在将 URL 解析为 IP 地址后,它会确保该地址不与配置设置中提供的任何被阻止的 IP 范围冲突。由于此控制机制应用于 IP 网络级别,因此它将应用于 Cypher 功能(例如 LOAD CSV)发出的任何 HTTP 和 FTP 请求。
有几个有用的资源可以帮助您计算所需的阻止列表。其中一个资源是 ipaddressguide.com,它提供了 IPv4 CIDR 和 IPv6 CIDR 范围的计算器。
用例
本节包含一些示例,以帮助说明该设置在实践中如何使用。
unsupported.dbms.cypher_ip_blocklist= |
不阻止任何流量(默认行为)。 |
unsupported.dbms.cypher_ip_blocklist=0.0.0.0/0,::/0 |
阻止所有 IPv4 和 IPv6 网络流量。 |
unsupported.dbms.cypher_ip_blocklist=10.0.0.0/8,ff:f::/64 |
阻止 10.0.0.0 到 10.255.255.255 之间的 IPv4 流量。 |
unsupported.dbms.cypher_ip_blocklist=10.0.0.0/8,10.0.0.0/24 |
阻止 10.0.0.0 到 10.255.255.255 之间的 IPv4 流量。 |
此页面有帮助吗?