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 infotMis 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ähenemine | Kui see töötab | Mida see leiab | Mida see igatseb |
|---|---|---|---|
| SAST (staatiline) | Enne käivitamist, lähtekoodil | Kooditaseme haavatavused, süstimismustrid, krüptograafiline väärkasutus, kõvakodeeritud saladused | Ainult käitusaja haavatavused, konfiguratsiooniprobleemid juurutamisel |
| DAST (dünaamiline) | Töötava rakenduse vastu | Käitusaja käitumine, autentimisvead, serveri konfiguratsiooniprobleemid | Kooditaseme mustrid ei käivitunud testimise ajal |
| SCA (tarkvara koostise analüüs) | Sõltuvus avaldub | Teadaolevad CVE-d kolmandate osapoolte teekides | Kohandatud koodi haavatavused |
| IAST (interaktiivne) | Testi läbiviimise ajal instrumentidega | Käitusaja andmevood suure täpsusega | Nõ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 kategooria | SAST-i katvus | DAST-i katvus |
|---|---|---|
| Katkine juurdepääsukontroll | Osalised, koodiloogika lüngad | Hea käitumiskatsete testimine |
| Krüptograafilised tõrked | Tugev algoritmiline tuvastamine | Nõrk, väljastpoolt raskesti jälgitav |
| Süst | Tugev, plekianalüüs | Tugev ja aktiivne kasuliku koormuse testimine |
| Ebakindel disain | Osaline mustri tuvastamine | Nõrk, nõuab disainialaseid teadmisi |
| Turvalisuse vale seadistamine | Osaline, konfiguratsioon koodis | Tugev reaalajas testimine |
| Haavatavad komponendid | Nõrk, SCA on parem | Nõrk, SCA on parem |
| Autentimise tõrked | Osalised, kõvakodeeritud krediidid, nõrgad mustrid | Tugev, seansi- ja autentimistestimine |
| Andmete terviklikkuse tõrked | Osalised deserialiseerimismustrid | Nõrk, väliselt raskesti tuvastatav |
| Logimise tõrked | Osalised, puuduvad logiväljaanded | Nõrk, raskesti märgatav puudumine |
| SSRF | Tugev, HTTP-kõnele kahjulik | Tugev 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:
| Vahend | Põhikeeled | OWASP tugevused | Lähenemine |
|---|---|---|---|
| CodeQL | Java, JS/TS, Python, C/C++, Go, Ruby | A03 Sissepritse, A10 SSRF (sügav määrdumine) | Interprotseduuriline semantiline analüüs |
| Semgrep | 30 + keeled | A03, A02, A07 (mustripõhine + plekirežiim) | Mustri sobitamine + pealiskaudne määrdumine |
| Snyki kood | Java, JS/TS, Python, C# | A03, A07, A08 | ML-põhine plekianalüüs |
| soundQube | 30 + keeled | A02, A03, A05, A07, A09 | Reeglipõhine + andmevoog |
| linnuke | 30 + keeled | Täielik OWASP-i leviala | Interprotseduaalne plekk |
| Verakood | Java, .NET, JS, PHP | Täielik OWASP-i leviala | Baitkoodi + plekianalüüs |
| OWASP ZAP | Keeleagnostik | A01, A05, A07 (käitusaeg) | DAST, dünaamiline testimine |
| SMART TS XL | COBOL, JCL, Java, Python, RPG, SQL | Keeledevaheline rikkumine, sõltuvusrisk | Keeledevaheline 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.