date 10 Aralık 2021

Lamp  Güvenlik Açıklıkları, F5

Bugün ortaya çıkarılan yüksek skorlu 0-day olan ve CVE-2021-44228- CVE-2021-45046 – CVE-2021-45105 ve CVE-2021-4104 numaralarıyla yayınlanan açıklıkla alakalı F5 sistemlerindeki mevcut durum aşağıdaki gibidir.

Son güncelleme: 23 Aralık 2021 09:26

 

Açıklıktan BIG-IP F5 etkileniyor mu?

Hayır etkilenmiyor. https://support.f5.com/csp/article/K19026212 adresinde detaylarını ve güncel durumu bulabildiğiniz üzere ortaya çıkarılan bu açıklıktan mevcut BIG-IP F5 versiyonları etkilenmemektedir.

Bntpro F5 cve 2021 4422

Apache log4j2 kullananlar açıklıktan nasıl kurtulabilir?

F5 arkasındaki sunucularda yer alan uygulamalarda eğer Apache log4j2 kütüphanesi (Versiyon 2.0 – 2.14.1) kullanılıyorsa bu açıklıktan F5 AWAF kullanıcıları sistemlerinde imza seti güncellemesi yaparak uygulamalarını koruyabilirler.

F5 Networks tarafından yayınlanan ve bu set içerisinde yer alan  200104768 ve 200104769 ID’li imzalar ile bu açıklığa maruz kalan uygulamaları koruma altına alınabilirsiniz. Bu 2 imzaya ek olarak Server Side Code Injection Signature Setinde yer alan  200004450, 200004451, 200004474, 200104770 ,200104771, 200104772 ,200104773,200104774 ,2001047745 ve 2001047746  ID’li imzaları da kullandığınız imza setine eklemeniz gerekmektedir.

    1. Server Side Code Injection signature 200104768 for JNDI Injection Attempt (Parameter)
    2. Server Side Code Injection signature 200104769 for JNDI Injection Attempt (Header)
    3. Server Side Code Injection Signature 200004451 forJSP Expression Language Expression Injection (2) (Header)
    4. Server Side Code Injection Signature 200004450 for JSP Expression Language Expression Injection (2) (Parameter)
    5. Server Side Code Injection signature 200104770 for JSP Expression Language Expression Injection (3) (Parameter)
    6. Server Side Code Injection signature 200104771 for JSP Expression Language Expression Injection (3) (Header)
    7. Server Side Code Injection signature 200104772 for JNDI Injection Attempt (Content)
    8. Server Side Code Injection signature 200104773 for JSP Expression Language Expression Injection (3) (Content)
    9. Server Side Code Injection Signature 200004474 for JSP Expression Language Expression Injection (3) (URI)
    10. Server Side Code Injection signature 200104774 for Log4j2 Lookup expression
    11. Server Side Code Injection signature 200104775 for Log4j2 Lookup expression (Parameter)
    12. Server Side Code Injection signature 200104776 for Log4j2 Lookup expression (Header)

Eğer F5 AWAF modülü kullanıyorsanız ve uygulamanız Apache log4j2 kütüphanesinin açıklığa maruz versiyonlarını kullanıyorsa F5 üzerinde yer alan WAF Attack signature’ları güncellemeniz ve ilgili politikada imza setlerini enforce modda kullanmanız yeterli olacaktır.

Kullanılacak güncel attack signature setini downloads.f5.com adresinde kullandığınız F5 versiyonunun altında ASM-AttackSignatures_20211222_103347.im ismiyle olarak bulabilirsiniz.

Bntpro F5 AWAF Attack Signatures download

F5 Advanced WAF olmadan Apache Log4j2 kullanan uygulamalar korunabilir mi?

Evet, eğer Apache Log4j2 kütüphanesini kullanıyor ancak F5 AWAF lisansına sahip değilseniz, F5 LTM modülünde aşağıdaki irule ile kullandığınız sunucular için koruma sağlayabilirsiniz. Ancak en kısa sürede F5 Networks’ün web firewall ürünü olan F5 AWAF (eski adıyla ASM) lisansını elde ederek bundan sonra çıkacak 0-Day ataklar için daha hazırlıklı olabilirsiniz.

# F5 iRule for Mitigation of log4j Vulnerabilities
# For additional information please see https://support.f5.com/csp/article/K59329043
#
# Version 2.5 - 2021-12-17 04:15 Eastern
# - New payload seen, regexp updated
# Version 2.4 - 2021-12-16 18:55 Eastern
# - Optimization of regexp
# - Additional comments for clarity
# Version 2.3 - 2021-12-16 03:40 Eastern
# - Moved regexp to static variable
# - Updated regexp to handle more encodings/evasions
# - Added controls to logging levels - beware logging the exploit to a vulnerable log server
# - Performance improvements
# Version 2.2 - 2021-12-13 19:00 Eastern
# - Added PUT method payload check
# Version 2.1 - 2021-12-13 17:00 Eastern
# - Revision to header & body regexp for new evasions
# - Made default URI regexp less aggressive to avoid false positives - same as header & body now
# - Added while loop limit
# Version 2.0 - 2021-12-11 23:40 Eastern
# - Handling nested URI encoding
# - Improved matching
# Version 1.0 - 2021-12-11 06:10 Eastern
# - Initial release
#

when RULE_INIT {
# To switch to a much more aggressive regexp uncomment the first line and comment the second.
#    set static::log4j_regex {(?i)($|\\+(0?44|([u0]00|x)24))'?(\{|\\+(0?173|([u0]00|x)7b))'?}
    set static::log4j_regex {(?i)($|\\+(0?44|([u0]00|x)24))'?(\{|\\+(0?173|([u0]00|x)7b))'?\s*((j|b|\\+(0?1[5140]2|([u0]00|x)[64][a2]))|(($|\\+(0?44|([u0]00|x)24))?'?(\{|\\+(0?173|([u0]00|x)7b))'?.+?'?(\}|\\+(0?175|([u0]00|x)7d))'?))}
}

when HTTP_REQUEST {
# set debugLogging to 0 not to log, 1 to log without exploit, 2 to log exploit
set debugLogging 1

# URI blocking
# Be sure you're patched for CVE-2021-22991 or remove -normalized
    set tmpUri [HTTP::uri -normalized]
    set uri [URI::decode $tmpUri]
    set loopLimit 5
    set loopCount 1
    while { $uri ne $tmpUri } {
        if {$loopCount >= $loopLimit} {
            if {$debugLogging == 1} {
                log local0. "log4j_rce_detection drop on URI loop limit: $loopCount"
            }
            if {$debugLogging == 2} {
                log local0. "log4j_rce_detection drop on URI loop limit: $loopCount $uri"
            }
            drop
            event disable all
            return
        } else {
            set tmpUri $uri
            set uri [URI::decode $tmpUri]
            incr loopCount
        }
    }

    if {$uri matches_regex $static::log4j_regex} {
        if {$debugLogging == 1} {
            log local0. "log4j_rce_detection drop on URI"
        }
        if {$debugLogging == 2} {
            log local0. "log4j_rce_detection drop on URI: $uri"
        }
        drop
        event disable all
        return
    }

# Header blocking
    set tmpReq [HTTP::request]
    set req [URI::decode $tmpReq]
    set loopLimit 5
    set loopCount 1
    while { $req ne $tmpReq } {
        if {$loopCount >= $loopLimit} {
            if {$debugLogging == 1} {
                log local0. "log4j_rce_detection drop on header loop limit: $loopCount"
            }
            if {$debugLogging == 2} {
                log local0. "log4j_rce_detection drop on header loop limit: $loopCount $req"
            }
            drop
            event disable all
            return
        } else {
            set tmpReq $req
            set req [URI::decode $tmpReq]
            incr loopCount
        }
    }

    if {$req matches_regex $static::log4j_regex} {
        if {$debugLogging == 1} {
            log local0. "log4j_rce_detection drop on header"
        }
        if {$debugLogging == 2} {
            log local0. "log4j_rce_detection drop on header: $req"
        }     
        drop
        event disable all
        return
    }

# POST & PUT Payload blocking collection
# NOTE: This only collects the first 1MB by default - edit 'collectSize' to change
    set collectSize 1048576
    if {([HTTP::method] eq "POST") || ([HTTP::method] eq "PUT")} {
    # Trigger collection for up to 1MB of data
        if {[HTTP::header "Content-Length"] ne "" && [HTTP::header "Content-Length"] <= $collectSize}{
            set content_length [HTTP::header "Content-Length"]
        } else {
            set content_length $collectSize
        }
        # Check if $content_length is not set to 0
        if { $content_length > 0} {
            HTTP::collect $content_length
        }
    }
}

when HTTP_REQUEST_DATA {
# POST & PUT Payload blocking
# set debugLogging to 0 not to log, 1 to log without exploit, 2 to log exploit
    set debugLogging 1

    set tmpPayload [HTTP::payload]
    set payload [URI::decode $tmpPayload]
    set loopLimit 5
    set loopCount 1
    while { $payload ne $tmpPayload } {
        if {$loopCount >= $loopLimit} {
            if {$debugLogging == 1} {
                log local0. "log4j_rce_detection drop on payload loop limit: $loopCount"
            }
            if {$debugLogging == 2} {
                log local0. "log4j_rce_detection drop on payload loop limit: $loopCount $payload"
            }         
            drop
            event disable all
            return
        } else {
            set tmpPayload $payload
            set payload [URI::decode $tmpPayload]
            incr loopCount
        }
    }

    if {$payload matches_regex $static::log4j_regex} {
        if {$debugLogging == 1} {
            log local0. "log4j_rce_detection drop on payload"
        }
        if {$debugLogging == 2} {
            log local0. "log4j_rce_detection drop on payload: $payload"
        }
        drop
        event disable all
        return
    }
}

Konuyla ilgili detaylı teknik bilgiye aşağıdaki linklerden ulaşabilirsiniz.