כיצד SAST מטפל ב-10 הפגיעויות המובילות של OWASP

ניתוח קוד סטטי לאבטחה: כיצד SAST מטפל ב-10 הפגיעויות המובילות של OWASP

קל יותר למנוע פגיעויות אבטחה מאשר לתקן אותן. תיקון של פגם בהזרקת SQL שמתגלה בסקירת קוד אורך דקות. תיקון של אותו פגם שמתגלה לאחר פרצה גובה שבועות של תגובה לאירועים, חקירה רגולטורית ותיקון, בנוסף לכל מידע שנגנב בין לבין. ניתוח קוד סטטי הוא תחום של מציאת בעיות אלו לפני שהקוד פועל, על ידי בחינת מבנה קוד המקור, זרימת הנתונים ודפוסים מול חתימות פגיעויות ידועות. ניתוח קוד סטטי, המיושם באופן שיטתי, הופך את האבטחה מפרקטיקה תגובתית לתכונה מובנית של תהליך הפיתוח.

עשרת ה-OWASP המובילים הוא הקטלוג הסמכותי של סיכוני האבטחה הקריטיים ביותר של יישומי אינטרנט, המעודכן על ידי פרויקט אבטחת יישומי אינטרנט פתוחים בהתבסס על נתוני פגיעויות מהעולם האמיתי באלפי יישומים. כל פריט ברשימה ניתן לזיהוי, בדרגות שונות, על ידי כלי ניתוח סטטיים. מדריך זה ממפה כל קטגוריית OWASP למה שניתוח סטטי יכול למצוא, מציג את תבנית הקוד הפגיעה ואת המקבילה המאובטחת שלה, ומסביר אילו כלים מיישמים כל טכניקה.

מצא זריקה לפני שתוקפים עושים זאת

SMART TS XL עוקבת אחר פגיעויות מממשקי API של JavaScript דרך שירותי Java ועד למערכות backend של COBOL.

מידע נוסף

מהי בדיקת אבטחת יישומים סטטית (SAST)?

בדיקת אבטחת יישומים סטטית, SAST, מנתחת קוד מקור, קוד בייט או קובץ בינארי מבלי להפעיל את התוכנית. הניתוח בוחן כיצד נתונים זורמים דרך היישום, לאילו פעולות רגישות אבטחה הנתונים מגיעים, והאם נתיב כלשהו מקלט חיצוני (קלט משתמש, פרמטרי HTTP, תוכן קובץ, משתני סביבה) מוביל לפעולה מסוכנת (שאילתת מסד נתונים, פקודת מערכת, פלט HTML, פונקציה קריפטוגרפית) ללא אימות או ניקוי מתאימים.

SAST הוא שכבה אחת בתוכנית אבטחת יישומים מלאה. הבנת היכן הוא משתלב דורשת השוואה לחלופות:

גישהכאשר זה פועלמה זה מוצאמה זה מפספס
SAST (סטטי)לפני הביצוע, בקוד המקורפגיעויות ברמת הקוד, דפוסי הזרקה, שימוש לרעה בקריפטוגרפיה, סודות מקודדיםפגיעויות בזמן ריצה בלבד, בעיות תצורה בפריסה
DAST (דינמי)כנגד יישום פעילהתנהגות בזמן ריצה, פגמי אימות, בעיות תצורת שרתתבניות ברמת הקוד לא הופעלו במהלך הבדיקה
SCA (ניתוח הרכב תוכנה)על ביטויי תלותCVEs ידועים בספריות של צד שלישיפגיעויות קוד מותאם אישית
IAST (אינטראקטיבי)במהלך ביצוע הבדיקה עם מכשורזרימת נתוני זמן ריצה בדיוק גבוהדורש אפליקציה פועלת, משוב איטי יותר

SAST מספק את המשוב המוקדם ביותר, הוא פועל על קוד שטרם נפרס, בצינור CI/CD או אפילו ב-IDE, לפני שהפגיעות מגיעה לסביבת בדיקה. מוקדמות זו היא ערך האבטחה העיקרי שלו.

אילו סוגי איומים יכול ניתוח קוד סטטי למתן?

זוהי אחת השאלות המבוקשות ביותר בנוגע ל-SAST. התשובה הישירה:

ניתוח קוד סטטי יכול למתן איומים המתבטאים בדפוסי קוד המקור : פגיעויות הזרקה (SQL, פקודה, XSS), שימוש לרעה בקריפטוגרפיה, אישורים מקודדים, יישומי אימות לא מאובטחים, בקרת גישה מקולקלת בלוגיקת הקוד וכשלים בשלמות הנתונים. הוא אינו יכול למתן איומים הנובעים מתצורת זמן ריצה, טופולוגיית רשת או הגדרת תשתית, אלו דורשים DAST, בדיקות חדירה או סריקת אבטחת תשתית.

ניתוח סטטי לעומת ניתוח דינמי לכיסוי OWASP

ניתוח דינמי (DAST) וניתוח סטטי (SAST) מוצאים תת-קבוצות שונות של פגיעויות OWASP. אף אחת מהן אינה מכסה את הכל. מדריך בדיקות אבטחת האינטרנט של OWASP (WSTG) הוא מסגרת המתודולוגיה לבדיקות דינמיות; כלי SAST כמו CodeQL, Semgrep ו-SonarQube מטפלים בשכבת קוד המקור.

קטגוריית 10 המובילים של OWASPכיסוי SASTכיסוי DAST
בקרת גישה שבורהפערים חלקיים בלוגיקה בקודבדיקות התנהגות בזמן ריצה טובות
כשלים קריפטוגרפייםזיהוי אלגוריתמי חזקחלש, קשה לצפייה מבחוץ
הזרקהניתוח חזק ומלא כתמיםבדיקות מטען חזקות ואקטיביות
עיצוב לא בטוחזיהוי חלקי של תבניותחלש, דורש ידע בעיצוב
תצורה מוטעית של האבטחהחלקי, הגדרה בקודבדיקות סביבה חזקות וחיוניות
רכיבים פגיעיםחלש, SCA עדיףחלש, SCA עדיף
כשלי אימותאימות חלקי, קידוד קשיח, דפוסים חלשיםבדיקות חזקות, בדיקות סשן ואימות
כשלים בשלמות הנתוניםדפוסי ביטול סריאליזציה חלקייםחלש, קשה לזיהוי חיצונית
כשלים ברישוםהצהרות יומן חלקיות וחסרותהיעדרות חלשה וקשה לצפייה
SSRFחזק, כתם לקריאה של HTTPבדיקת בקשות חזקה ואקטיבית

המסקנה: SAST ו-DAST משלימים זה את זה. לקבלת כיסוי OWASP מקסימלי, יש להפעיל את שניהם. עבור צוותים מוגבלי תקציב, החל מאפס, SAST תחילה, הוא מספק את משוב המפתחים המהיר ביותר ואת כיסוי ההזרקה הרחב ביותר.

10 המובילים של OWASP: מה ניתוח סטטי מוצא וכיצד

A01, בקרת גישה מקולקלת

בקרת גישה פגומה היא הסיכון העיקרי של OWASP. ניתוח סטטי מטפל בביטויים ברמת הקוד: בדיקות הרשאה חסרות בפונקציות ובנקודות קצה, הפניות לאובייקטים שחושפות מזהים פנימיים ללא אימות, והקצאות תפקידים קידודיות שעוקפות מבני הרשאות מיועדים.

מה ניתוח סטטי מזהה: שיטות המטפלות בפעולות רגישות ללא בדיקת הרשאה מתאימה; הפניות ישירות לאובייקטים שבהן מזהה האובייקט מגיע מקלט משתמש ללא אימות גישה; דפוסי גלישה בכפייה שבהם מצב אישור נבדק אך בעלות על אובייקט לא.

תאווה

// 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;
}

מה שניתוח סטטי לא יכול לתפוס: כשלים בבקרת גישה בזמן ריצה שבהם הלוגיקה נכונה אך הנתונים המשמשים לקבלת ההחלטה נפגעים. לשם כך נדרשים בדיקות DAST ובדיקות חדירה.

A02, כשלים קריפטוגרפיים

קריפטוגרפיה חלשה ניתנת לזיהוי באופן אמין באמצעות ניתוח סטטי מכיוון שהדפוסים הפגיעים, MD5, SHA-1, DES, מצב ECB, ומפתחות מקודדים קשיחים, ניתנים לזיהוי לקסיקלי בקוד המקור.

פִּיתוֹן

# 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)

דגל כללי ניתוח סטטי: MD5/SHA-1 למטרות רגישות אבטחה, מצב DES/3DES/RC4/ECB, מפתחות וסודות קריפטוגרפיים מקודדים בקפידה, HTTP במקום HTTPS להעברת נתונים רגישים, ואימות אישורים מושבת (verify=False בבקשות פייתון, setHostnameVerifier(ALLOW_ALL_HOSTNAME_VERIFIER) בג'אווה).

A03, הזרקה

הזרקה (Injection), SQL, פקודות OS, LDAP, XSS והזרקת תבניות, היא הקטגוריה שבה ניתוח זיהומים בין-פרוצדוריים מספק את הערך הישיר ביותר שלו. הפגיעות דורשת מעקב אחר קלט לא אמין מהמקור שלו דרך קריאות פונקציה ל-sink מסוכן.

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');

צארפ

// 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");

כלים המבצעים ניתוח זיהומים בין-פרוצדוריים לצורך הזרקה: CodeQL (המדויק ביותר), Semgrep עם מצב זיהומים, Snyk Code, SonarQube עם כללי אבטחה.

A04, עיצוב לא מאובטח

עיצוב לא מאובטח הוא קטגוריית OWASP הקשה ביותר לניתוח סטטי מכיוון שהיא נוגעת להחלטות אדריכליות ולא לדפוסי קוד. ניתוח סטטי יכול לסמן את התסמינים:

חסרה לוגיקה של הגבלת קצב בנקודות קצה של אימות, היעדר נעילת חשבון לאחר ניסיונות כושלים, לוגיקה עסקית שמדלגת על שלבי אימות ופונקציות המבצעות פעולות מורשות ללא רישום ביקורת. אלה ניתנים לזיהוי כתבניות חסרות, ניתוח סטטי המדווח על מה שחסר ולא על מה שכן קיים.

חלק מכלי SAST תומכים בכללים מותאמים אישית שיכולים לקודד דרישות עיצוב אבטחה ארגוניות: כל שיטת בקר חייבת לקרוא לפונקציית אישור, כל כתיבה למסד נתונים חייבת להיות מוקדמת על ידי אימות קלט, וכל קריאה חיצונית ל-API חייבת להשתמש בפסק זמן. כללים מותאמים אישית אלה ממירים דרישות עיצוב לאילוצי קוד הניתנים לאכיפה.

A05, שגיאת תצורת אבטחה

תצורת אבטחה שגויה בקוד כוללת: תכונות אבטחה מושבתות, כותרות CORS מתירות, כותרות תגובה אבטחה חסרות, מצב ניפוי שגיאות מופעל בסביבת ייצור והודעות שגיאה מפורטות שחושפות עקבות מחסנית.

פִּיתוֹן

# 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)

דגל כללי ניתוח סטטי: מצב ניפוי שגיאות מוגדר ל- True במקור, מקורות CORS עם תווים כלליים, כותרות אבטחה חסרות בתצורות תגובת HTTP, אימות אישור SSL מושבת ותעודות ברירת מחדל בקבצי תצורה.

A06, רכיבים פגיעים ומיושנים

קטגוריה זו מטופלת בעיקר על ידי ניתוח הרכב תוכנה (SCA) ולא על ידי SAST מסורתי. סריקות SCA package.json, pom.xml, requirements.txt, ומניפסטים דומים כנגד מאגרי מידע של פגיעויות (מאגר המידע הלאומי לפגיעויות, מאגר המידע הייעוצי של GitHub).

SAST תורם על ידי זיהוי שימוש ב-API מיושן, קריאות לפונקציות ספרייה שהוחלפו עקב פגמי אבטחה, או שימוש ישיר בתבניות פגיעות שאפילו ספריות מעודכנות כבר אינן ממליצות עליהן.

כלים ספציפיים עבור A06: npm audit, pip-audit, snyk test, OWASP Dependency-Check, GitHub Dependabot, ו-Mend (לשעבר WhiteSource).

A07, כשלים בזיהוי ואימות

ניתוח סטטי מוצא את תבניות האימות ברמת הקוד: סיסמאות מקודדות קשיחות, אימות סיסמאות חלש, אסימוני הפעלה שנוצרו באקראיות שאינה קריפטוגרפית, פסילת הפעלה חסרה בעת יציאה, ויישומים של JWT המקבלים את none אלגוריתם.

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
});

צארפ

// 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, כשלים בשלמות תוכנה ונתונים

קטגוריה זו מכסה ביטול סריאליזציה לא מאובטח ועדכוני תוכנה לא מאומתים. ניתוח סטטי מזהה: ג'אווה ObjectInputStream ביטול סידור נתונים ממקורות לא מהימנים, פייתון pickle.loads() על נתונים חיצוניים, PHP unserialize() עם קלט בשליטת המשתמש, ומנתחי YAML המשתמשים בטוענים לא בטוחים.

פִּיתוֹן

# 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, כשלים ברישום וניטור אבטחה

כשלים ברישום נתונים ניתנים לזיהוי באמצעות ניתוח סטטי כתבניות חסרות: פעולות רגישות, אירועי אימות, החלטות בקרת גישה, שינויי נתונים, שמתבצעים ללא הצהרות רישום נלוות. כללי ניתוח סטטי יכולים לדרוש שקריאות פונקציה מסוימות יתרחשו תמיד במקביל לקריאות רישום ביקורת.

מה ניתוח סטטי מסמן: רישום סיסמאות או טוקנים (רישום נתונים רגישים הוא גם פגיעות), מטפלי חריגים שבולעים שגיאות בשקט ללא רישום, ולוכדים בלוקים שרושמים את הודעת החריגה הגולמית (שעשויה להכיל נתונים רגישים).

תאווה

// 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, זיוף בקשות בצד השרת (SSRF)

SSRF הוא טיעון חזק לניתוח כתמים בין-פרוצדוריים. הפגיעות דורשת מעקב אחר קלט הנשלט על ידי המשתמש עד לבקשת HTTP, לעתים קרובות באמצעות מספר קריאות פונקציה. כלי שמנתח רק פונקציות בודדות אינו יכול לזהות SSRF כאשר בניית ה-URL וקריאת ה-HTTP נמצאות בפונקציות שונות.

פִּיתוֹן

# 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

כלי ניתוח קוד סטטי עבור אבטחת OWASP

הטבלה שלהלן ממפה את כלי ה-SAST העיקריים לקטגוריות OWASP בהן הם מטפלים בצורה היעילה ביותר:

כלישפות עיקריותנקודות החוזק של OWASPגישה
CodeQLג'אווה, JS/TS, פייתון, C/C++, גו, רוביA03 הזרקה, A10 SSRF (כתם עמוק)ניתוח סמנטי בין-פרוצדורלי
Semgrep30 + שפותA03, A02, A07 (מצב מבוסס דפוס + כתמים)התאמת תבניות + כתם רדוד
קוד סניקג'אווה, JS/TS, פייתון, C#A03, A07, A08ניתוח כתמים מבוסס ML
soundQube30 + שפותA02, A03, A05, A07, A09זרימת נתונים מבוססת כללים
צ'קמרקס30 + שפותכיסוי מלא של OWASPכתם בין-פרוצדורי
veracodeג'אווה, .NET, JS, PHPכיסוי מלא של OWASPניתוח בייטקוד + זיהום
OWASP ZAPאגנוסטית לשפהA01, A05, A07 (זמן ריצה)DAST, בדיקות דינמיות
SMART TS XLCOBOL, JCL, ג'אווה, פייתון, RPG, SQLכתמים בין-לשוניים, סיכון לתלותכתם מבני + כתמים בין-לשוניים

איך SMART TS XL מטפל באבטחה בבסיסי קוד ארגוניים

תוכניות אבטחה ארגוניות מתמודדות עם אתגר שכלי SAST בשפה אחת אינם יכולים לפתור: משטח ההתקפה משתרע על פני שפות. יישום אינטרנט עשוי לקבל קלט משתמש ב-JavaScript, לעבד אותו ב-Java, ולהעביר אותו דרך תור הודעות לתוכנית COBOL שמבצעת SQL כנגד מסד נתונים של DB2. פגיעות ההזרקה קיימת על פני ארבעה גבולות שפה. אף סורק שפות בודד אינו רואה את נתיב הזיהום המלא.

SMART TS XL"S ניתוח קוד סטטי מכסה כל שפה בשרשרת זו בו זמנית. כאשר קלט לא מהימן זורם ממטפל API של JavaScript דרך שירות Java לתוך תוכנית COBOL שבונה שאילתת SQL דינמית, SMART TS XL עוקב אחר נתיב זה על פני גרף הקריאה המלא בין-לשוני, אותו מעקב אחר זיהומים בין-פרוצדורלי ש-CodeQL מיישם בתוך Java, מיושם על פני Java, COBOL ו-SQL יחד.

יכולת מיפוי תלות היישומים מספקת תצוגה רלוונטית לאבטחה של אילו רכיבים במערכת מקיימים אינטראקציה עם קלטים חיצוניים, אילו מגיעים לפעולות מורשות, וכיצד נראה בפועל משטח ההתקפה המלא של המערכת. תצוגה ארכיטקטונית זו של אבטחה היא הבסיס למידול איומים, לא ניתן למדל איומים כנגד מערכת שאת המבנה שלה אינך מבין.

יכולת ניתוח ההשפעה משמשת לתוכניות תיקון אבטחה: כאשר מתגלה פגיעות ברכיב, ניתוח ההשפעה מזהה כל רכיב אחר שתלוי ברכיב הפגיע, תוך קביעת היקף מאמצי התיקון במדויק לפני שינוי קוד כלשהו. עבור בסיסי קוד גדולים מדור קודם שבהם תוכנית COBOL עם פגם אבטחה כלולה על ידי מאות תוכניות אחרות, הכרת היקף התיקון המלא לפני תחילת התהליך היא ההבדל בין תיקון מנוהל לאירוע מדורג.

עבור ארגונים המנהלים מודרניזציה מורשת תוכניות, ניתוח אבטחה של בסיס הקוד הישן הוא תנאי הכרחי, לא מחשבה שלאחר מעשה. העברת תוכניות COBOL פגיעות ל-Java מייצרת תוכניות Java פגיעות. SMART TS XLניתוח האבטחה של מבטיח שהפגיעויות מזוהות ומתוקנות כחלק מתהליך המודרניזציה, ולא יתגלו במערכת שהועברה.

שילוב SAST במחזור חיי הפיתוח

ניתוח אבטחה סטטי מספק את הערך המרבי שלו כאשר הוא פועל בנקודת קבלת ההחלטה, שבה קוד נכתב ונבדק, ולא לאחר פריסתו.

ב-IDE: SonarLint, הרחבות ה-IDE של Snyk, והרחבת VS Code של CodeQL מציגות ממצאים מוטבעים בזמן שמפתחים כותבים קוד. דגל הזרקת SQL שמופיע ברגע שמפתח מקליד את התבנית הפגיעה לוקח שניות לתקן.

בבקשות משיכה: SAST המשולב ב-GitHub Actions, GitLab CI או Jenkins פועל על כל בקשת משיכה ומפרסם ממצאים כהערות סקירת קוד מוטבעות. המפתח רואה את הממצא בהקשרו, לצד הקוד שגרם לו.

כשער איכות: מודל שערי האיכות של SonarQube חוסם מיזוגים כאשר נקודות חמות אבטחה קריטיות חדשות מוצגות. זה הופך את האבטחה לא לשלב סקירה אופציונלי אלא לדרישה מבנית של תהליך המיזוג.

על בסיס מתוזמן: ניתוח עמוק בין-פרוצדורי, CodeQL, Checkmarx, ערכות כללים מלאות של Semgrep, בדרך כלל איטי מדי פעם לביצוע לפי commit אך פועל מדי לילה או שבוע בענף הראשי, ומאתר פגיעויות הדורשות ניתוח מלא של גרף קריאות כדי לזהות.

הגישה המרובדת, כללים מהירים מבוססי תבניות ב-IDE וב-commits, ניתוח מעמיק של זיהומים בבקשות משיכה וב-nightly, מספקים הן את המיידיות הדרושה למפתחים והן את היסודיות הנדרשת לתוכניות אבטחה.