介绍

根据sonatype官方给出的公告信息,Nexus Repository Manager 3存在一个任意EL表达式注入漏洞,攻击通过构造特殊请求可可实现远程任意代码执行。

  • 关于sonatype Nexus Sonatype Nexus Repository Manager(又名NXRM)是一款maven仓库管理应用。
  • 受影响Richfaces版本:

    • All previous Nexus Repository Manager 3 OSS/Pro versions up to and including 3.13.0

补丁分析

Nexus对于CVE-2018-16621的漏洞修复补丁对比:

nexus-public/EscapeHelper.java at f94f870eb4dbee30f82b9290e10a35658d4105f8 · sonatype/nexus-public · GitHub

在3.14.0版本中最,新增了EscapeHelper.stripJavaEl方法对用户输入roles参数进行过滤,正则匹配的结果是将‘${’替换为‘{ ’,从而防止EL表达式注入。

e71d33c3.png

其中EscapeHelper.stripJavaEl的实现如下:

/**
   * Strip java el start token from a string
   * @since 3.14
   */
  public String stripJavaEl(final String value) {
    if (value != null) {
      return value.replaceAll("\\$+\\{", "{");
    }
    return null;
  }
}

漏洞成因

在 org.sonatype.nexus.security.privilege.PrivilegesExistValidator 和 org.sonatype.nexus.security.role.RolesExistValidator 类中,会将没有找到的 privilege 或 role 放入错误模板中,而在错误模板在渲染的时候会提取其中的EL表达式并执行

漏洞复现

拉取一个版本低于3.14.0的Nexus docker镜像,这里随便找一个shifudao/nexus3:

docker pull shifudao/nexus3

使用如下命令运行:

docker run -d -p 8081:8081 --name nexus shifudao/nexus3

访问http://localhost:8081 并使用默认账号密码admin:admin123登录Nexus,创建用户并修改用户角色参数roles,也可通过创建角色的roles 和 privileges参数触发如图: ebeb068b.png

修复建议

官方已发布修复版本,升级版本至3.14.0即可,升级帮助:https://support.sonatype.com/hc/en-us/articles/115000350007

参考