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

相關文章