说白了,这个洞不是过漏撞库撞出来的,也不是产生密码爆破,而是原因Nacos自己把门打开了。核心问题在于它默认鉴权机制的证绕设计缺陷——当你在服务端配置了`nacos.core.auth.enabled=false`(或没显式开启),控制台和API接口就完全裸奔。过漏攻击者只需要往`User-Agent`头里塞一个`Nacos-Server`,产生就能冒充服务端组件,原因绕过所有身份校验。证绕这招叫“身份伪造”,过漏跟拿员工工牌冒充保安一个道理。产生
更拧巴的原因是,即便你开了鉴权,证绕老版本(1.4.0之前)还有个致命逻辑漏洞。过漏它的产生`AuthFilter`过滤器只检查`/v1/auth/`路径下的请求,其他像`/v1/cs/configs`这种配置读写接口,居然不在拦截范围内。我拿Burp实测过,直接POST一个空配置到`/v1/cs/configs`,服务器返回200,连token都不用带。这就像小区保安只查正门,侧墙的洞随便钻。
还有个容易被忽略的触发点——密钥硬编码。Nacos默认的`secret.key`是`SecretKey012345678901234567890123456789012345678901234567890123456789`,这串字符在GitHub上挂了五年没人换。攻击者拿到这个key就能自己签发JWT token,伪造管理员身份。你想想,锁芯是通用的,钥匙还挂在门口,这跟没锁有啥区别?
实际攻击链比想象中更简单。我复现过一次:先扫端口发现8848,然后直接访问`/nacos/v1/auth/users?pageNo=1&pageSize=9`,返回的JSON里直接列了所有账号密码的哈希值。整个过程没绕过任何东西,因为接口本身就不设防。后来官方在1.4.1里加了`server.identity`参数才堵住,但很多生产环境至今还跑着旧版本。
根子上的问题在于设计哲学——Nacos把“内网信任”当默认前提,认为服务端组件之间通信是安全的。这个假设在微服务架构里早就过时了,因为攻击者可能已经通过某个业务容器打进了内网。我见过不少公司把Nacos暴露在公网,就为了省个VPN的钱,结果成了整个集群的突破口。
修复方案其实不复杂,但得动刀:升级到2.2.0以上,强制开启鉴权,换掉默认密钥,再给控制台套一层独立认证。关键是要改掉“默认不设防”的思维惯性——安全配置不该是选做题,而是必答题。这漏洞能活五年,不是技术难,是懒。