Kuidas SAST lahendab OWASP-i 10 peamist haavatavust

Staatiline koodianalüüs turvalisuse tagamiseks: kuidas SAST lahendab OWASP-i 10 peamist haavatavust

Turvahaavatavusi on lihtsam ennetada kui parandada. Koodiülevaate käigus avastatud SQL-süstimise vea parandamine maksab minuteid. Sama vea avastamiseks pärast rikkumist kulub nädalaid intsidendile reageerimist, regulatiivset uurimist ja parandusmeetmeid, millele lisanduvad kõik vahepeal välja filtreeritud andmed. Staatiline koodianalüüs on distsipliin, mille käigus leitakse need probleemid enne koodi käivitamist, uurides lähtekoodi struktuuri, andmevoogu ja mustreid teadaolevate haavatavuste signatuuride suhtes. Süstemaatiliselt rakendatuna muudab see turvalisuse reaktiivsest praktikast arendusprotsessi sisseehitatud omaduseks.

OWASP Top 10 on autoriteetne kataloog kõige kriitilisematest veebirakenduste turvariskidest, mida ajakohastab Open Web Application Security Project tuhandete rakenduste reaalsete haavatavuste andmete põhjal. Iga loendi üksus on staatilise analüüsi tööriistade abil erineval määral tuvastatav. See juhend seob iga OWASP kategooria sellega, mida staatiline analüüs suudab leida, näitab haavatava koodi mustrit ja selle turvalist vastet ning selgitab, millised tööriistad iga tehnikat rakendavad.

Leia süst enne ründajaid

SMART TS XL jälgib haavatavusi JavaScripti API-dest Java teenuste kaudu COBOL-i taustaprogrammideni.

Rohkem infot

Mis on staatiline rakenduste turvalisuse testimine (SAST)?

Staatiline rakenduse turvatestimine (SAST) analüüsib lähtekoodi, baitkoodi või binaarfaili ilma programmi käivitamata. Analüüs uurib, kuidas andmed rakenduses liiguvad, millistele turvatundlikele toimingutele need andmed jõuavad ja kas mõni välise sisendi (kasutaja sisend, HTTP-parameetrid, faili sisu, keskkonnamuutujad) tee viib ohtliku toiminguni (andmebaasi päring, süsteemikäsk, HTML-väljund, krüptograafiline funktsioon) ilma sobiva valideerimise või puhastamiseta.

SAST on üks kiht terviklikus rakenduse turvaprogrammis. Selle sobivuse mõistmine nõuab võrdlemist alternatiividega:

LähenemineKui see töötabMida see leiabMida see igatseb
SAST (staatiline)Enne käivitamist, lähtekoodilKooditaseme haavatavused, süstimismustrid, krüptograafiline väärkasutus, kõvakodeeritud saladusedAinult käitusaja haavatavused, konfiguratsiooniprobleemid juurutamisel
DAST (dünaamiline)Töötava rakenduse vastuKäitusaja käitumine, autentimisvead, serveri konfiguratsiooniprobleemidKooditaseme mustrid ei käivitunud testimise ajal
SCA (tarkvara koostise analüüs)Sõltuvus avaldubTeadaolevad CVE-d kolmandate osapoolte teekidesKohandatud koodi haavatavused
IAST (interaktiivne)Testi läbiviimise ajal instrumentidegaKäitusaja andmevood suure täpsusegaNõuab töötavat rakendust, aeglasem tagasiside

SAST annab kõige varasemat tagasisidet, see töötab koodil, mida pole veel juurutatud, CI/CD torujuhtmes või isegi IDE-s, enne kui haavatavus jõuab testkeskkonda. See varajane saabumine on selle peamine turvaväärtus.

Milliseid ohte saab staatilise koodianalüüsi abil leevendada?

See on üks enim otsitud küsimusi SAST-i kohta. Otsene vastus:

Staatiline koodianalüüs aitab leevendada ohte, mis avalduvad lähtekoodi mustrites : süstimisnõrkused (SQL, käsk, XSS), krüptograafiline väärkasutus, kõvakodeeritud volitused, ebaturvalised autentimise rakendused, vigane juurdepääsu kontroll koodiloogikas ja andmete terviklikkuse tõrked. See ei suuda leevendada ohte, mis tulenevad käitusaja konfiguratsioonist, võrgu topoloogiast või infrastruktuuri seadistusest, mis nõuavad DAST-i, penetratsioonitestimist või infrastruktuuri turvalisuse skaneerimist.

Staatiline analüüs vs dünaamiline analüüs OWASP katvuse jaoks

Dünaamiline analüüs (DAST) ja staatiline analüüs (SAST) leiavad OWASP-i haavatavuste erinevaid alamhulki. Kumbki ei kata kõike. OWASP-i veebiturbe testimise juhend (WSTG) on dünaamilise testimise metoodika raamistik; SAST-i tööriistad nagu CodeQL, Semgrep ja SonarQube käsitlevad lähtekoodi kihti.

OWASP 10 parima kategooriaSAST-i katvusDAST-i katvus
Katkine juurdepääsukontrollOsalised, koodiloogika lüngadHea käitumiskatsete testimine
Krüptograafilised tõrkedTugev algoritmiline tuvastamineNõrk, väljastpoolt raskesti jälgitav
SüstTugev, plekianalüüsTugev ja aktiivne kasuliku koormuse testimine
Ebakindel disainOsaline mustri tuvastamineNõrk, nõuab disainialaseid teadmisi
Turvalisuse vale seadistamineOsaline, konfiguratsioon koodisTugev reaalajas testimine
Haavatavad komponendidNõrk, SCA on paremNõrk, SCA on parem
Autentimise tõrkedOsalised, kõvakodeeritud krediidid, nõrgad mustridTugev, seansi- ja autentimistestimine
Andmete terviklikkuse tõrkedOsalised deserialiseerimismustridNõrk, väliselt raskesti tuvastatav
Logimise tõrkedOsalised, puuduvad logiväljaandedNõrk, raskesti märgatav puudumine
SSRFTugev, HTTP-kõnele kahjulikTugev ja aktiivne päringute testimine

Kokkuvõte: SAST ja DAST täiendavad teineteist. Maksimaalse OWASP-i katvuse saavutamiseks käivitage mõlemad. Eelarvepiiranguga meeskondade jaoks, kes alustavad nullist, käivitage esmalt SAST, see pakub kiireimat arendajatele tagasisidet ja kõige laiemat süstimisulatust.

OWASP 10 parimat: mida staatiline analüüs leiab ja kuidas

A01, Katkine juurdepääsukontroll

Katkine juurdepääsu kontroll on OWASP-i peamine risk. Staatiline analüüs käsitleb kooditaseme ilminguid: puuduvad funktsioonide ja lõpp-punktide autoriseerimiskontrollid, objektiviited, mis paljastavad sisemised ID-d ilma valideerimiseta, ja kõvakodeeritud rollimäärangud, mis mööduvad kavandatud õigusstruktuuridest.

Mida staatiline analüüs tuvastab: meetodid, mis käsitlevad tundlikke toiminguid ilma vastava autoriseerimiskontrollita; otsesed objektiviited, kus objekti ID pärineb kasutaja sisendist ilma juurdepääsu valideerimiseta; sundsirvimismustrid, kus autentitud olekut kontrollitakse, kuid objekti omandiõigust mitte.

Java

// Vulnerable: no ownership check -- any authenticated user can access any order
@GetMapping("/orders/{orderId}")
public Order getOrder(@PathVariable Long orderId) {
    return orderRepository.findById(orderId).orElseThrow();
}

// Secure: verify the order belongs to the requesting user
@GetMapping("/orders/{orderId}")
public Order getOrder(@PathVariable Long orderId,
                      @AuthenticationPrincipal UserDetails user) {
    Order order = orderRepository.findById(orderId).orElseThrow();
    if (!order.getOwnerId().equals(user.getUserId())) {
        throw new AccessDeniedException("Order does not belong to requesting user");
    }
    return order;
}

Mida staatiline analüüs ei suuda tabada: ligipääsukontrolli tõrked käitusajal, mille puhul loogika on õige, kuid otsuse tegemiseks kasutatavad andmed on ohustatud. Nende jaoks on vaja DAST-i ja penetratsioonitestimist.

A02, Krüptograafilised tõrked

Nõrk krüptograafia on staatilise analüüsi abil usaldusväärselt tuvastatav, kuna haavatavad mustrid – MD5, SHA-1, DES, ECB režiim ja kõvakodeeritud võtmed – on lähtekoodis leksikaalselt tuvastatavad.

püüton

# Vulnerable: MD5 for password hashing (broken algorithm)
import hashlib
password_hash = hashlib.md5(password.encode()).hexdigest()

# Vulnerable: hardcoded encryption key
KEY = b"mysecretkey12345"
cipher = AES.new(KEY, AES.MODE_ECB)  # ECB mode also vulnerable

# Secure: bcrypt for passwords, environment-sourced keys
import bcrypt, os
password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))

# Secure: AES-GCM with environment-sourced key
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = os.environ["ENCRYPTION_KEY"].encode()
aesgcm = AESGCM(key)

Staatilise analüüsi reeglite lipp: MD5/SHA-1 turvatundlikel eesmärkidel, DES/3DES/RC4/ECB režiim, kõvakodeeritud krüptograafilised võtmed ja saladused, HTTP HTTPS-i asemel tundlike andmete edastamiseks ja keelatud sertifikaatide kontrollimine (verify=False Pythoni päringutes setHostnameVerifier(ALLOW_ALL_HOSTNAME_VERIFIER) Javas).

A03, Süstimine

Injektsioon, SQL, OS-käsk, LDAP, XSS, malliinjektsioon on kategooria, kus protseduuridevaheline rikkuse analüüs pakub kõige otsesemat väärtust. Haavatavus nõuab ebausaldusväärse sisendi jälgimist selle allikast funktsioonikõnede kaudu ohtliku neeldajani.

JavaScript

// Vulnerable: direct string interpolation in SQL (SQL injection)
app.get('/users', async (req, res) => {
    const name = req.query.name;
    const result = await db.query(`SELECT * FROM users WHERE name = '${name}'`);
    res.json(result.rows);
});

// Secure: parameterized query
app.get('/users', async (req, res) => {
    const name = req.query.name;
    const result = await db.query('SELECT * FROM users WHERE name = $1', [name]);
    res.json(result.rows);
});

php

// Vulnerable: unescaped output (XSS)
echo "Welcome, " . $_GET['username'];

// Secure: context-appropriate escaping
echo "Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8');

csharp

// Vulnerable: command injection in C#
var process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/c " + userInput;
process.Start();

// Secure: avoid shell interpretation, validate and whitelist inputs
var allowedCommands = new HashSet<string> { "report", "export" };
if (!allowedCommands.Contains(userInput))
    throw new ArgumentException("Invalid command");

Tööriistad, mis teostavad süstimiseks protseduuridevahelist saasteanalüüsi: CodeQL (kõige täpsem), Semgrep saasterežiimiga, Snyk Code, SonarQube turvareeglitega.

A04, Ebaturvaline disain

Ebaturvaline disain on staatilise analüüsi jaoks kõige keerulisem OWASP-kategooria, kuna see puudutab pigem arhitektuurilisi otsuseid kui koodimustreid. Staatiline analüüs saab esile tõsta sümptomeid:

Puuduv kiirusepiirangu loogika autentimisotspunktides, konto lukustuse puudumine pärast ebaõnnestunud katseid, äriloogika, mis jätab valideerimisetapid vahele, ja funktsioonid, mis teostavad privilegeeritud toiminguid ilma auditilogimiseta. Need on tuvastatavad puuduvate mustritena, staatilise analüüsina, mis annab aru puuduva kohta, mitte selle kohta, mis on olemas.

Mõned SAST-tööriistad toetavad kohandatud reegleid, mis saavad kodeerida organisatsiooni turvalisuse disaininõudeid: iga kontrolleri meetod peab kutsuma autoriseerimisfunktsiooni, igale andmebaasi kirjutamisele peab eelnema sisendi valideerimine, iga väline API-kõne peab kasutama ajalõpu. Need kohandatud reeglid teisendavad disaininõuded jõustatavateks koodipiiranguteks.

A05, Turvalisuse valekonfiguratsioon

Koodi turvakonfiguratsiooni vead hõlmavad järgmist: keelatud turvafunktsioonid, lubavad CORS-päised, puuduvad turvavastuse päised, silumisrežiimi lubamine tootmiskeskkonnas ja pikad veateated, mis paljastavad pinu jälgi.

püüton

# Vulnerable: Flask debug mode enables interactive debugger in production
app = Flask(__name__)
app.run(debug=True)  # exposes console access if error occurs

# Vulnerable: overly permissive CORS
from flask_cors import CORS
CORS(app, origins="*")  # allows any origin

# Secure: environment-controlled debug, restricted CORS
import os
debug_mode = os.environ.get("FLASK_DEBUG", "false").lower() == "true"
CORS(app, origins=os.environ.get("ALLOWED_ORIGINS", "").split(","))
app.run(debug=debug_mode)

Staatilise analüüsi reeglite lipp: silumisrežiimiks on seatud True allikas, metamärkidega CORS-i päritolu, puuduvad turvapäised HTTP-vastuse konfiguratsioonides, keelatud SSL-sertifikaadi kontrollimine ja vaikeseaded konfiguratsioonifailides.

A06, Haavatavad ja aegunud komponendid

Sellele kategooriale lähenetakse peamiselt tarkvara kompositsioonianalüüsi (SCA) abil, mitte traditsioonilise SAST-i abil. SCA-skaneeringud package.json, pom.xml, requirements.txtja sarnased manifestid haavatavuste andmebaaside (riiklik haavatavuste andmebaas, GitHubi nõuandeandmebaas) vastu.

SAST aitab tuvastada aegunud API kasutust, turvavea tõttu asendatud teekide funktsioonidele suunatud kõnesid või haavatavate mustrite otsest kasutamist, mida isegi ajakohased teegid enam ei soovita.

Spetsiaalsed tööriistad A06 jaoks: npm audit, pip-audit, snyk test, OWASP Dependency-Check, GitHub Dependabot ja Mend (endine WhiteSource).

A07, Identifitseerimise ja autentimise tõrked

Staatiline analüüs leiab kooditaseme autentimise vastased mustrid: kõvakodeeritud paroolid, nõrk parooli valideerimine, mittekrüptograafilise juhuslikkusega genereeritud seansi märgid, seansi kehtetuks tunnistamise puudumine väljalogimisel ja JWT implementatsioonid, mis aktsepteerivad none algoritm.

JavaScript

// Vulnerable: JWT accepting 'none' algorithm -- allows signature bypass
const decoded = jwt.verify(token, secret, { algorithms: ['HS256', 'none'] });

// Vulnerable: hardcoded admin credentials
if (username === 'admin' && password === 'admin123') {
    grantAccess();
}

// Secure: algorithm whitelist, no hardcoded credentials
const decoded = jwt.verify(token, process.env.JWT_SECRET, {
    algorithms: ['HS256']  // explicit allowlist only
});

csharp

// Vulnerable: weak random for session token generation in C#
var sessionToken = new Random().Next().ToString();

// Secure: cryptographically secure random
using var rng = RandomNumberGenerator.Create();
var bytes = new byte[32];
rng.GetBytes(bytes);
var sessionToken = Convert.ToBase64String(bytes);

A08, Tarkvara ja andmete terviklikkuse tõrked

See kategooria hõlmab ebaturvalist deserialiseerimist ja kontrollimata tarkvarauuendusi. Staatiline analüüs tuvastab: Java ObjectInputStream ebausaldusväärsetest allikatest pärit andmete deserialiseerimine, Python pickle.loads() väliste andmete, PHP peal unserialize() kasutaja juhitava sisendiga ja YAML-i parsijatega, mis kasutavad ohtlikke laadureid.

püüton

# Vulnerable: pickle deserialization of untrusted data
import pickle
data = pickle.loads(request.data)  # arbitrary code execution risk

# Vulnerable: unsafe YAML loader
import yaml
config = yaml.load(user_input)  # yaml.load without Loader is unsafe

# Secure: safe alternatives
import json
data = json.loads(request.data)  # JSON cannot execute code

import yaml
config = yaml.safe_load(user_input)  # safe_load disables arbitrary object creation

A09, Turvalogi ja jälgimise tõrked

Logimise tõrked on staatilise analüüsi abil tuvastatavad puuduvate mustritena: tundlikud toimingud, autentimissündmused, juurdepääsukontrolli otsused, andmemuudatused, mis toimuvad ilma kaasnevate logikirjeteta. Staatilise analüüsi reeglid võivad nõuda, et teatud funktsioonikutsed toimuksid alati koos auditilogi kutsega.

Mida staatiline analüüs märgistab: paroolide või tokenite logimine (tundlike andmete logimine on samuti haavatavus), erandite käitlejad, mis neelavad vead vaikselt ja ilma logimiseta alla, ja püügiplokid, mis logivad töötlemata eranditeate (mis võib sisaldada tundlikke andmeid).

Java

// Vulnerable: swallowed exception, no logging
try {
    authenticateUser(username, password);
} catch (Exception e) {
    // silent failure -- no log, no audit trail
}

// Vulnerable: logging sensitive data
log.info("User logged in with password: " + password);

// Secure: log the event, not the credential
try {
    authenticateUser(username, password);
    auditLog.info("Authentication success for user: {}", username);
} catch (AuthenticationException e) {
    auditLog.warn("Authentication failure for user: {}", username);
    throw e;  // do not swallow
}

A10, Serveripoolne päringute võltsimine (SSRF)

SSRF on tugev argument interprotseduurilise haavatavuse analüüsi jaoks. Haavatavus nõuab kasutaja juhitava sisendi jälgimist kuni HTTP-päringuni, sageli mitme funktsioonikõne kaudu. Tööriist, mis analüüsib ainult üksikuid funktsioone, ei suuda SSRF-i tuvastada, kui URL-i konstruktsioon ja HTTP-kõne on erinevates funktsioonides.

püüton

# Vulnerable: user-controlled URL in HTTP request (SSRF)
import requests

def fetch_resource(url):
    return requests.get(url).content  # no validation

def api_endpoint(request):
    target = request.json().get("url")    # attacker controls this
    return fetch_resource(target)          # SSRF across function boundary

# Secure: allowlist validation before making the request
from urllib.parse import urlparse

ALLOWED_HOSTS = {"api.internal.example.com", "cdn.example.com"}

def fetch_resource(url: str) -> bytes:
    parsed = urlparse(url)
    if parsed.hostname not in ALLOWED_HOSTS:
        raise ValueError(f"URL host not allowed: {parsed.hostname}")
    return requests.get(url, timeout=5).content

Staatilise koodi analüüsi tööriistad OWASP turvalisuse jaoks

Allolev tabel kaardistab peamised SAST-tööriistad OWASP-kategooriatesse, mida nad kõige tõhusamalt käsitlevad:

VahendPõhikeeledOWASP tugevusedLähenemine
CodeQLJava, JS/TS, Python, C/C++, Go, RubyA03 Sissepritse, A10 SSRF (sügav määrdumine)Interprotseduuriline semantiline analüüs
Semgrep30 + keeledA03, A02, A07 (mustripõhine + plekirežiim)Mustri sobitamine + pealiskaudne määrdumine
Snyki koodJava, JS/TS, Python, C#A03, A07, A08ML-põhine plekianalüüs
soundQube30 + keeledA02, A03, A05, A07, A09Reeglipõhine + andmevoog
linnuke30 + keeledTäielik OWASP-i levialaInterprotseduaalne plekk
VerakoodJava, .NET, JS, PHPTäielik OWASP-i levialaBaitkoodi + plekianalüüs
OWASP ZAPKeeleagnostikA01, A05, A07 (käitusaeg)DAST, dünaamiline testimine
SMART TS XLCOBOL, JCL, Java, Python, RPG, SQLKeeledevaheline rikkumine, sõltuvusriskKeeledevaheline struktuur + plekk

Kuidas SMART TS XL Lahendab turvalisuse ettevõtte koodibaasides

Ettevõtte turvaprogrammid seisavad silmitsi väljakutsega, mida ühekeelsed SAST-tööriistad ei suuda lahendada: rünnakupind hõlmab mitut keelt. Veebirakendus võib vastu võtta kasutaja sisendit JavaScriptis, töödelda seda Javas ja edastada selle sõnumijärjekorra kaudu COBOL-programmile, mis käivitab SQL-käsu DB2 andmebaasi vastu. Süstimishaavatavus esineb nelja keele piirides. Ükski keele skanner ei näe kogu nakatumisteed.

SMART TS XL'S staatilise koodi analüüs hõlmab kõiki selle ahela keeli samaaegselt. Kui ebausaldusväärne sisend voolab JavaScript API käitlejalt Java teenuse kaudu COBOL-programmi, mis loob dünaamilise SQL-päringu, SMART TS XL jälgib seda teed kogu keeltevahelise kõnegraafiku ulatuses, sama interprotseduraalset plekijälgimist, mida CodeQL rakendab Java-s, rakendatuna Java, COBOLi ja SQL-i ulatuses koos.

Rakendussõltuvuste kaardistamise funktsioon annab turvalisusega seotud ülevaate sellest, millised süsteemi komponendid suhtlevad väliste sisenditega, millised jõuavad privilegeeritud toiminguteni ja milline süsteemi täielik rünnakupind tegelikult välja näeb. See arhitektuuriline turvalisuse vaade on ohtude modelleerimise alus – te ei saa modelleerida ohte süsteemi vastu, mille struktuuri te ei mõista.

Mõjuanalüüsi võimalus teenindab turvaparandusprogramme: kui komponendis leitakse haavatavus, tuvastab mõjuanalüüs kõik teised komponendid , mis haavatavast komponendist sõltuvad, määrates parandusmeetmete ulatuse täpselt kindlaks enne koodi muutmist. Suurte pärandkoodibaaside puhul, kus turvaveaga COBOL-programm on kaasatud sadadesse teistesse programmidesse, on parandusmeetmete täieliku ulatuse teadmine enne alustamist see, mis eristab hallatud parandust kaskaadjuhtumist.

Organisatsioonidele, mis haldavad pärand moderniseerimine programmide puhul on pärandkoodibaasi turvaanalüüs eeltingimus, mitte järelmõte. Haavatavate COBOL-programmide migreerimine Javasse loob haavatavaid Java programme. SMART TS XLTurvaanalüüs tagab, et haavatavused tuvastatakse ja parandatakse moderniseerimisprotsessi osana, mitte ei avastata neid migreeritud süsteemis.

SAST-i integreerimine arendustsüklisse

Staatiline turvaanalüüs annab oma maksimaalse väärtuse siis, kui seda tehakse otsustushetkel, kus koodi kirjutatakse ja üle vaadatakse, mitte pärast selle juurutamist.

IDE-s: SonarLint, Snyki IDE laiendused ja CodeQL-i VS Code laiendus kuvavad leide arendajate koodi kirjutamisel. SQL-süstimise lipp, mis kuvatakse hetkel, kui arendaja sisestab haavatava mustri, maksab sekundeid, et seda parandada.

Pull request'ides: GitHub Actionsi, GitLab CI või Jenkinsisse integreeritud SAST töötab iga pull request'i puhul ja postitab leiud koodisiseste kommentaaridena. Arendaja näeb leitu kontekstis koos selle põhjustanud koodiga.

Kvaliteedikontrollijana: SonarQube'i kvaliteedikontrolli mudel blokeerib liitmised uute kriitiliste turvapunktide lisamisel. See muudab turvalisuse mitte valikuliseks ülevaatusetapiks, vaid liitmisprotsessi struktuuriliseks nõudeks.

Planeeritud alusel: sügav protseduuridevaheline analüüs, CodeQL, Checkmarx, täielikud Semgrepi reeglistikud, on tavaliselt liiga aeglane igakuiseks täitmiseks, kuid töötab igal õhtul või igal nädalal peaharul, leides haavatavusi, mille tuvastamiseks on vaja täielikku kõnegraafiku analüüsi.

Kihiline lähenemine, kiired mustripõhised reeglid IDE-s ja commit'ides, põhjalik rikkuse analüüs pull request'ides ja igal ööl pakub nii arendajatele vajalikku kohesust kui ka turvaprogrammidele vajalikku põhjalikkust.