Skywalking SQL注入漏洞 (CVE-2020-9483)開源應對方案:APISIX
0×01 概要
Apache Skywalking最近暴露了一個SQL注入漏洞:CVE-2020-9483。
Apache SkyWalking是一個APM管理軟件(應用性能監控),用於跟跑分析線上系統的性能,支持TCP、HTTP協議。這次出問題的Skywalking的軟件版本號是6.0-6.6、7.0,升級官網版本8.0後,SQL注入漏洞問題被修復。
出問題的是Apache SkyWalking的Graph QL協議接口。GraphQL是Facebook開源的數據查詢規範。一用於API的查詢語言,是對REST API的一種封裝描述。原本REST API的JSON協議下的接口,如果代碼實現不注重安發規範也會存在安全隱患,Apache SkyWalking Graph QL這次就出現SQL注入安全問題。SQL注入發生在Skywalking使用H2/MySQL/TiDB這三種數據庫做存儲的場景條件下,特定版本軟件中可復現這個安全漏洞。
ElasticSearch也支持SQL查詢,是通過插件實現支持的,ES不屬於關係型數據庫,如果Skywalking用的存儲方案用是ES,這個SQL注入的問題可能會弱化一些。
0×02 應急解決方案
騰訊漏洞報告給出的應急對應方案:第一種方案:升級到官網網本的8.0版本。第二種方案:對Skywalking外網暴露的接口進行安全授權。第三種方案:最通用的方案,上WEB防火牆防護。
如果用戶系統部署了WAF系統,可以用SQL注入的臨時攔截策略進行處理,在請求沒有到達Skywalking時,讓WAF系統攔截過濾掉含有SQL注入請求。
0×03 開源解決方案
這篇重點是用開源方案解決問題,加入一層API網關,在Skywalking還沒升級到8.0之前,將線上的老版本Skywalking的SQL注入的安全問題解決掉。將上面提到的第二、三方案,通過同一種軟件系統實現落地,在Skywaling升級的過程中,也能保證本地對外網開放的Skywalking接口的安全性。
APISIX網關和Skywalking同屬於Apache的項目,APISIX本身支持Skywalking,有對應支持的插件,並且同時支持URL的鑑權(第二種方案)、URI的黑名單過濾(WAF的功能之一,SQL注入攔截)。
APISIX是開源的系統,在Nginx、OpenResty構建的應用網關產品,可以方便的實現上游管理,支持各種插件。APISIX的Skywalking插件與Skywalking配合,可以可視化的度量經過APISIX的請求,APISIX的同類開源網關產品,比如:Kong。
這是APISIX在Skywalking上的跟蹤圖。
最近出現CVE-2020-9483的問題,不升級Skywalking8.0的解決方案問題如下:
以前表過,不升級的方案:一種方案是對外網接口加鑑權認證,一種用防火牆攔截SQL注入。在APISIX當中,我們通過幾個功能插件的添加,調整一下插件的執行順序,就可不用升級Skywalking,解決這個安全問題。
1.接口認證。
爲了避免外網可以直接訪問接口Skywalking的接口,我們將Skywalking的請求,先轉給APISIX網關, 由APISIX網關對請求進行認證,然後將通過認證請求轉發給Skywalking。選用兩個APISIX插件:Key-auth:通過加Key進行權限管理。Basic-auth:通過用戶名密碼對接進行加密權限管理。
2.SQL注入攔截。
一般的SQL注入,WAF系統會根據請求中存在的SQL子句特徵進行攔截,APISIX同樣有URI的過濾插件:
URI-Blocker:URI攔截黑名單。
0×04 攔截SQL注入
local core = require("apisix.core") local re_compile = require("resty.core.regex").re_match_compile local re_find = ngx.re.find localipairs = ipairs local schema = { type = "object", properties = { block_rules = { type = "array", items = { type = "string", minLength = 1, maxLength = 4096, }, uniqueItems = true }, rejected_code = { type = "integer", minimum = 200, default = 403 }, }, required = {"block_rules"}, } local plugin_name = "uri-blocker" local _M = { version = 0.1, priority = 2900, name = plugin_name, schema = schema, } function_M.check_schema(conf) local ok, err = core.schema.check(schema, conf) if not ok then return false, err end local block_rules = {} for i, re_rule in ipairs(conf.block_rules) do local ok, err = re_compile(re_rule,"j") -- core.log.warn("ok: ", tostring(ok), "err: ", tostring(err), " re_rule: ", re_rule) if not ok then return false, err end block_rules[i] = re_rule end conf.block_rules_concat = core.table.concat(block_rules, "|") core.log.info("concatblock_rules: ", conf.block_rules_concat) return true end function_M.rewrite(conf, ctx) core.log.info("uri: ", ctx.var.request_uri) local from = re_find(ctx.var.request_uri, conf.block_rules_concat,"jo") if from then core.response.exit(conf.rejected_code) end end return _M
上面是基本的黑名單過濾邏輯:用戶準備若干SQL識別正則,可以識別正常的URI中存在可疑 的SQL文子句,對於這種URI直接進行攔截,或者將請求轉發給蜜罐系統,這是另一個插件來實現的(動態上游)。
簡單舉例說明, 如何寫SQL注入攔截正則,如下:
1.“select.+(from|limit)” 2.“(?:(union(.*?)select))” 3.“having”
啓用APISIX的URI-Blocker插件的方法,如下:
curl -ihttp://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY:edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/*", "plugins": { "uri-blocker": { "block_rules":["root.exe", "root.m+"] } }, "upstream": { "type":"roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'
APISIX支持API調用的插件打開方式,我們將SQL注入識別的正則,通過這種方式在APISIX網關中註冊生效各種插件。如果在Skywalking升級到8.0以後,可以快速的通過這種方式關閉插件。
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/*", "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'
0×05 總結
如果您在Skywalking的使用過程中,或是某些開源軟件的使用過程中,恰巧遇見類似的安全問題,想用一種低成本的方案解決CVE-2020-9483這種突發安全問題,可以考慮以上所說的開源解決方案,系統開源,即插即用。這次是Skywalking問題,以後也許會是其他軟件,是需要一種敏捷的系統,速度的對應解決安全問題的。
參考連接:
https://mp.weixin.qq.com/s/tVJQa4so8nm0RYiWiKUYww
https://github.com/apache/incubator-apisix
https://shengyang.xyz/apisix/URI-blocker/
*本文作者:糖果L5Q,轉載請註明來自FreeBuf.COM