漏洞概述 该漏洞涉及Zitadel项目中HTTP客户端的使用,具体包括以下几个方面: 1. SSRF攻击:攻击者可以通过设置任何URL作为后端登录URL,潜在地指向资源中的资源。 2. DNS重绑定攻击:现有的denylist使用方式容易受到DNS重绑定攻击。 3. 重定向和HTTPS降级:现有的denylist使用方式容易受到重定向和HTTPS降级攻击。 4. 常见默认条目:现有的denylist使用方式容易受到常见默认条目的攻击。 影响范围 后端登录URL:攻击者可以设置任何URL作为后端登录URL。 通知webhooks和SAML元数据URL:这些URL容易受到SSRF攻击。 DNS重绑定攻击:现有的denylist使用方式容易受到DNS重绑定攻击。 重定向和HTTPS降级:现有的denylist使用方式容易受到重定向和HTTPS降级攻击。 常见默认条目:现有的denylist使用方式容易受到常见默认条目的攻击。 修复方案 1. 添加HTTP客户端配置:允许使用单个HTTP客户端,使用denylist、超时、重定向和降级设置。 2. 实现新的HTTP传输函数:返回一个HTTP.RoundTripper,用于在“Control”之前检查denylist,以防止DNS重绑定攻击。 3. 使用io.LimitReader包装器:使用可配置的MaxBodySize来防止OOM问题或DOS攻击。 4. 动态denylist:不再需要为每个denylist定义,只需定义denylist目标并分配给每个denylist。 5. 传播全局全局denylist的使用:在所有地方使用现有的denylist。 6. 阻止创建OIDC客户端:如果选择的后端登录URL在denylist中。 7. 阻止使用后端登录URL的工作:这些URL在denylist中。 8. 实现相同的概念:用于webhooks(email和sms)。 9. 实现相同的概念:用于SAML元数据URL获取。 POC代码 ```go // apps/api/test-integration-api.yaml 80 + Deprecated: use HTTPClient.DenyList instead. If both are set, this list will be merged into the 81 + HTTPClient.DenyList. 82 + DenyList: ZITADEL_EXECUTIONS_DENYLIST (comma separated list) 83 + Projections: 84 + - "127.0.0.1" 85 + - "127.0.0.1/32" 86 + - "127.0.0.1/24" 87 + - "127.0.0.1/16" 88 + - "127.0.0.1/8" 89 + - "127.0.0.1/4" 90 + - "127.0.0.1/2" 91 + - "127.0.0.1/1" 92 + - "127.0.0.1/0" 93 + - "127.0.0.1" 94 + - "127.0.0.1/32" 95 + - "127.0.0.1/24" 96 + - "127.0.0.1/16" 97 + - "127.0.0.1/8" 98 + - "127.0.0.1/4" 99 + - "127.0.0.1/2" 100 + - "127.0.0.1/1" 101 + - "127.0.0.1/0" 102 + - "127.0.0.1" 103 + - "127.0.0.1/32" 104 + - "127.0.0.1/24" 105 + - "127.0.0.1/16" 106 + - "127.0.0.1/8" 107 + - "127.0.0.1/4" 108 + - "127.0.0.1/2" 109 + - "127.0.0.1/1" 110 + - "127.0.0.1/0" 111 + - "127.0.0.1" 112 + - "127.0.0.1/32" 113 + - "127.0.0.1/24" 114 + - "127.0.0.1/16" 115 + - "127.0.0.1/8" 116 + - "127.0.0.1/4" 117 + - "127.0.0.1/2" 118 + - "127.0.0.1/1" 119 + - "127.0.0.1/0" 120 + - "127.0.0.1" 121 + - "127.0.0.1/32" 122 + - "127.0.0.1/24" 123 + - "127.0.0.1/16" 124 + - "127.0.0.1/8" 125 + - "127.0.0.1/4" 126 + - "127.0.0.1/2" 127 + - "127.0.0.1/1" 128 + - "127.0.0.1/0" 129 + - "127.0.0.1" 130 + - "127.0.0.1/32" 131 + - "127.0.0.1/24" 132 + - "127.0.0.1/16" 133 + - "127.0.0.1/8" 134 + - "127.0.0.1/4" 135 + - "127.0.0.1/2" 136 + - "127.0.0.1/1" 137 + - "127.0.0.1/0" 138 + - "127.0.0.1" 139 + - "127.0.0.1/32" 140 + - "127.0.0.1/24" 141 + - "127.0.0.1/16" 142 + - "127.0.0.1/8" 143 + - "127.0.0.1/4" 144 + - "127.0.0.1/2" 145 + - "127.0.0.1/1" 146 + - "127.0.0.1/0" 147 + - "127.0.0.1" 148 + - "127.0.0.1/32" 149 + - "127.0.0.1/24" 150 + - "127.0.0.1/16" 151 + - "127.0.0.1/8" 152 + - "127.0.0.1/4" 153 + - "127.0.0.1/2" 154 + - "127.0.0.1/1" 155 + - "127.0.0.1/0" 156 + - "127.0.0.1" 157 + - "127.0.0.1/32" 158 + - "127.0.0.1/24" 159 + - "127.0.0.1/16" 160 + - "127.0.0.1/8" 161 + - "127.0.0.1/4" 162 + - "127.0.0.1/2" 163 + - "127.0.0.1/1" 164 + - "127.0.0.1/0" 165 + - "127.0.0.1" 166 + - "127.0.0.1/32" 167 + - "127.0.0.1/24" 168 + - "127.0.0.1/16" 169 + - "127.0.0.1/8" 170 + - "127.0.0.1/4" 171 + - "127.0.0.1/2" 172 + - "127.0.0.1/1" 173 + - "127.0.0.1/0" 174 + - "127.0.0.1" 175 + - "127.0.0.1/32" 176 + - "127.0.0.1/24" 177 + - "127.0.0.1/16" 178 + - "127.0.0.1/8" 179 + - "127.0.0.1/4" 180 + - "127.0.0.1/2" 181 + - "127.0.0.1/1" 182 + - "127.0.0.1/0" 183 + - "127.0.0.1" 184 + - "127.0.0.1/32" 185 + - "127.0.0.1/24" 186 + - "127.0.0.1/16" 187 + - "127.0.0.1/8" 188 + - "127.0.0.1/4" 189 + - "127.0.0.1/2" 190 + - "127.0.0.1/1" 191 + - "127.0.0.1/0" 192 + - "127.0.0.1" 193 + - "127.0.0.1/32" 194 + - "127.0.0.1/24" 195 + - "127.0.0.1/16" 196 + - "127.0.0.1/8" 197 + - "127.0.0.1/4" 198 + - "127.0.0.1/2" 199 + - "127.0.0.1/1" 200 + - "127.0.0.1/0" 201 + - "127.0.0.1" 202 + - "127.0.0.1/32" 203 + - "127.0.0.1/24" 204 + - "127.0.0.1/16" 205 + - "127.0.0.1/8" 206 + - "127.0.0.1/4" 207 + - "127.0.0.1/2" 208 + - "127.0.0.1/1" 209 + - "127.0.0.1/0" 210 + - "127.0.0.1" 211 + - "127.0.0.1/32" 212 + - "127.0.0.1/24" 213 + - "127.0.0.1/16" 214 + - "127.0.0.1/8" 215 + - "127.0.0.1/4" 216 + - "127.0.0.1/2" 217 + - "127.0.0.1/1" 218 + - "127.0.0.1/0" 219 + - "127.0.0.1" 220 + - "127.0.0.1/32" 221 + - "127.0.0.1/24" 222 + - "127.0.0.1/16" 223 + - "127.0.0.1/8" 224 + - "127.0.0.1/4" 225 + - "127.0.0.1/2" 226 + - "127.0.0.1/1" 227 + - "127.0.0.1/0" 228 + - "127.0.0.1" 229 + - "127.0.0.1/32" 230 + - "127.0.0.1/24" 231 + - "127.0.0.1/16" 232 + - "127.0.0.1/8" 233 + - "127.0.0.1/4" 234 + - "127.0.0.1/2" 235 + - "127.0.0.1/1" 236 + - "127.0.0.1/0" 237 + - "127.0.0.1" 238 + - "127.0.0.1/32" 239 + - "127.0.0.1/24" 240 + - "127.0.0.1/16" 241 + - "127.0.0.1/8" 242 + - "127.0.0.1/4" 243 + - "127.0.0.1/2" 244 + - "127.0.0.1/1" 245 + - "127.