漏洞簡(jiǎn)介
2022年12月22日,Apache 官方公告發(fā)布 ShardingSphere-Proxy 5.3.0 之前版本存在身份繞過漏洞(CVE-2022-45347)。當(dāng) ShardingSphere-Proxy 使用 MySQL 作為后端數(shù)據(jù)庫(kù)時(shí),由于 ShardingSphere-Proxy 在客戶端認(rèn)證失敗后沒有完全清理數(shù)據(jù)庫(kù)會(huì)話信息,攻擊者可利用未關(guān)閉的會(huì)話信息繞過 ShardingSphere-Proxy 的 MySQL 身份驗(yàn)證,執(zhí)行任意 sql 命令。
漏洞分析
Apache ShardingSphere 是一個(gè)可將任意數(shù)據(jù)庫(kù)轉(zhuǎn)換為分布式數(shù)據(jù)庫(kù)的生態(tài)系統(tǒng),ShardingSphere-Proxy 是一個(gè)支持 MySQL 和 PostgreSQL 的數(shù)據(jù)庫(kù)代理,提供了一個(gè)數(shù)據(jù)庫(kù)服務(wù)器,并封裝了數(shù)據(jù)庫(kù)二進(jìn)制協(xié)議來支持異構(gòu)語(yǔ)言。
以 Apache ShardingSphere 5.2.1 版本為例, 用戶可通過配置連接 ShardingSphere-Proxy 操作后端 MySQL 數(shù)據(jù)庫(kù):
(ShardingSphere-Proxy 應(yīng)用場(chǎng)景示意圖)
在該漏洞中存在的交互過程如下:
(MySQL client 與 ShardingSphere-Proxy 交互圖)
以Python/ target=_blank class=infotextkey>Python為例,當(dāng)使用錯(cuò)誤的賬號(hào)密碼通過 MySQL連接庫(kù)(如pymysql)連接 ShardingSphere-Proxy:
import pymysql
# MySQL client 連接 ShardingSphere-Proxy
db = pymysql.connect(host='localhost',
port=3307,
user='root',
password='Wrong password',
database='sharding_db')
cursor = db.cursor()
cursor.execute("show tables")
results = cursor.fetchall()
print(results)
db.close()
此時(shí)pymysql將根據(jù)返回的報(bào)文拋出異常,程序終止:
(ShardingSphere-Proxy 身份認(rèn)證失敗拋出異常)
但這時(shí)ShardingSphere-Proxy 的 MySQL 身份認(rèn)證模塊并未關(guān)閉 MySQL 客戶端連接會(huì)話:
(MySQLAuthenticationEngine#authenticate 源碼)
攻擊者如果構(gòu)造一個(gè)忽略身份驗(yàn)證失敗消息的MySQL客戶端,則可以通過ShardingSphere-Proxy繼續(xù)操作后端數(shù)據(jù)庫(kù)。例如可以將pymysql中拋出異常的代碼注釋掉:
(刪除 pymysql#connections.py 中的錯(cuò)誤處理邏輯)
再次嘗試可以發(fā)現(xiàn)在使用錯(cuò)誤的賬號(hào)密碼連接后,仍然能夠正常使用SQL語(yǔ)句,獲得相應(yīng)的數(shù)據(jù)返回結(jié)果:
(繞過 ShardingSphere-Proxy 身份驗(yàn)證并操作后端數(shù)據(jù)庫(kù))
(ShardingSphere-Proxy 后端數(shù)據(jù)庫(kù)信息)
ShardingSphere-Proxy v5.3.0 commits 中在 MySQL 客戶端認(rèn)證失敗后清理 context 修復(fù)此漏洞:
(漏洞修復(fù)代碼)
給開發(fā)者的建議
- 對(duì)失效的會(huì)話信息及時(shí)清理關(guān)閉,防止會(huì)話重用的風(fēng)險(xiǎn)。此類風(fēng)險(xiǎn)較為普遍,例如 LibreNMS 在22.10.0之前的版本也出現(xiàn)過類似的問題,由于未對(duì)失效的 cookie 進(jìn)行清理,導(dǎo)致攻擊者可利用舊的 cookie 進(jìn)行登錄。
- 對(duì)臨時(shí)文件或文件流及時(shí)關(guān)閉,防止內(nèi)存泄露或過多的資源消耗導(dǎo)致拒絕服務(wù)。
參考鏈接
- https://www.oscs1024.com/hd/MPS-2022-64480
- https://lists.apache.org/thread/l5rz7j4rg10o7ywtgknh2f5hxnv6yw3l
- https://github.com/apache/shardingsphere/commit/f3cc852dcbba89244ffcaef15a03ebf29693a14d
關(guān)于墨菲安全
墨菲安全是一家為您提供專業(yè)的軟件供應(yīng)鏈安全管理的科技公司,能力包括代碼安全檢測(cè)、開源組件許可證合規(guī)管理、云原生容器安全檢測(cè)、軟件成分分析(SCA)等,豐富的安全工具助您打造完備的軟件開發(fā)安全能力(DevSecOps)。
旗下的安全研究團(tuán)隊(duì)墨菲安全實(shí)驗(yàn)室,專注于軟件供應(yīng)鏈安全相關(guān)領(lǐng)域的技術(shù)研究,關(guān)注的方向包括:開源軟件安全、程序分析、威脅情報(bào)分析、企業(yè)安全治理等。公司核心團(tuán)隊(duì)來自百度、華為等企業(yè),擁有超過十年的企業(yè)安全建設(shè)、安全產(chǎn)品研發(fā)及安全攻防經(jīng)驗(yàn)。
https://www.murphysec.com/