BrassCoders גילו סודות מקודדים (hard-coded secrets) בשניים מתוך חמישה-עשר סקריפטים של Python שנוצרו על ידי בינה מלאכותית ונבדקו, מה שחושף סיכון ממשי למפתחים שמעתיקים ומדביקים קוד ישירות מפלט של מודלי שפה גדולים (LLMs). הממצאים מראים שכל מפתח או סיסמה שמוצבים במקום הלא נכון יכולים להפוך קטע קוד מועיל לדליפת פרטי גישה (credentials) בקרת גרסאות ובסביבות ייצור (production).

מה הבדיקה חשפה

הסקריפט הראשון, token_check.py, הופק מתוך פרומפט שביקש פונקציה לחתימה על אסימוני (tokens) סשן וכללה "דוגמה שניתן להשתמש בה". כדי להפוך את הקוד לניתן להרצה, המודל הכניס מפתח חתימת HMAC מפורש ישירות לקובץ המקור.

  • בעיה: מפתח הסוד נמצא בתוך בסיס הקוד.
  • סיכון: לכל מי שיש לו גישת קריאה למאגר (repository) יכול לראות את המפתח, וכל פריסה (deployment) שמושכת את הקובץ יורשת את הסוד.
  • השלכה: תוקף שמשיג את המפתח יכול לזייף אסימוני סשן תקפים, ובכך לעקוף בדיקות אימות (authentication).

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

  • בעיה: הסיסמה מופיעה כמחרוזת טקסט גלוי (plain-text) בקריאה לפונקציה.
  • סיכון: שינוי (rotation) של הסיסמה דורש שינוי בקוד ופריסה חדשה, ופרטי הגישה מתפשטים לכל סביבה המשתמשת בקובץ.
  • השלכה: ניתן לאסוף את הסיסמה מתוך בקרת גרסאות, לוגים או חבילות מקומפלות, מה שמעניק ליריב גישה לא מורשית לשרת הדואר.

למה ה-AI פולט סודות

מודלי שפה גדולים מייצרים טקסט על ידי השלמת הפרומפט. כאשר משתמש מבקש "דוגמה שניתן להשתמש בה", המודל מפרש זאת כ"קוד שרץ ללא הגדרות נוספות". לכן, הוא ממלא ערכים חסרים — מפתחות API, סיסמאות, אסימונים — בערכי Placeholder שנראים הגיוניים. למודל אין מודעות לשיטות עבודה מומלצות לניהול סודות (secret-management) אלא אם כן הפרומפט מציין זאת במפורש.

ניתוח שנערך לאחרונה על ידי Veracode לקוד שנוצר על ידי AI מצא כי 45% מהקטעים מכילים לפחות פגיעות אחת המופיעה ברשימת ה-OWASP Top 10, כאשר חשיפת פרטי גישה מהווה נתח משמעותי. הסטטיסטיקה מדגישה שהבעיה אינה מבודדת למספר מקרים חריגים; היא תוצר מערכתי של האופן שבו מודלים אלו מאומנים ומתקבלים באמצעות פרומפטים.

צעדי מניעה שמפתחים יכולים לנקוט כבר עכשיו

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

# token_check.py – secure version
import os
import hmac
import hashlib

SECRET_KEY = os.environ["HMAC_SECRET_KEY"]

def sign_token(data: bytes) -> str:
    return hmac.new(SECRET_KEY.encode(), data, hashlib.sha256).hexdigest()
# email_sender.py – secure version
import os
import smtplib

smtp_password = os.environ["SMTP_PASSWORD"]
server = smtplib.SMTP("smtp.example.com", 587)
server.starttls()
server.login("noreply@example.com", smtp_password)

שימוש ב-os.environ שואב את הערך מסביבת ההרצה (runtime), שומר עליו מחוץ לבקרת גרסאות ומאפשר ביצוע rotation ללא נגיעה בקבצי המקור. אותו דפוס עובד גם עם קבצי קונפיגורציה שמוחרגים מ-commits, שירותי ניהול סודות, או סודות המנוהלים באמצעות Container Orchestration.

אמצעי הגנה נוספים

  • סקירות קוד (Code reviews) שמסמנות מחרוזות מפורשות התואמות לתבניות של סודות נפוצים (למשל, רצפים ארוכים של תווים אלפאנוימריים).
  • כלי ניתוח סטטי (Static analysis tools) המכווננים לזיהוי פרטי גישה מקודדים בקבצים חדשים.
  • הנדסת פרומפטים (Prompt engineering): בקשו מהמודל במפורש "להשתמש במשתני סביבה עבור כל הסודות" או "להשמיט פרטי גישה אמיתיים".
  • Linting לאחר יצירה: הרצת סקריפט מהיר המחפש ערכים מפורשים (literals) חשודים לפני העתקת הקוד לפרויקט.

נקודת מבט נגדית: האם זה אומר שקוד של AI אינו בטוח?

נוכחותם של סודות מקודדים אינה מרמזת על כך שקוד שנוצר על ידי AI אינו בטוח באופן גורף. במקרים רבים, המודל מייצר לוגיקה נקייה ומובנית היטב שיכולה להאיץ את הפיתוח. הסיכון מתעורר כאשר מפתחים מתייחסים לפלט כאל מוכן לייצור (production-ready) ללא ביצוע ביקורת אבטחה. התייחסו ל-AI כעוזר טיוטה, ולא כתחליף לשיטות אבטחה מבוססות.

מה כדאי לעקוב אחריו בהמשך

  • עדכוני כלים: פלטפורמות AI מתחילות לשלב מסנני בטיחות המחליפים סודות בערכי Placeholder. מעקב אחר שינויים אלו יכול לצמצם את החשיפה.
  • שינויים במדיניות: ארגונים עשויים לקבוע הנחיות רשמיות לתכנות בסיוע AI, תוך דרישה לבדיקות ניהול סודות כחלק מתהליך ה-CI.
  • דפוסי קהילה: ככל שמפתחים ישתפו יותר "פרומפטים מאובטחים", תבניות של שיטות עבודה מומלצות עשויות להפוך לפלט ברירת המחדל למשימות נפוצות כמו חתימה על אסימונים או שליחת אימיילים.

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