אחת מהאקסיומות הגדולות של עולם האבטחה היא Obscurity is not security. כלומר שאנחנו לא יכולים להסתמך על סודיות הקוד שלנו שתהיה ערובה לכך שהמערכת שלנו תהיה מאובטחת ועלינו להתנהל בעולם כאילו תוקף רואה את הקוד שלנו כל הזמן. למשל, אם יש לי קוד כזה לחיבור ל-MySQL:
import mysql.connector
connection = mysql.connector.connect(
host='localhost',
database='example_db',
user='root',
password='password123'
)
# Proceed with operations using `connection`...
זה נורא ואיום. למה? אם תוקף ישיג גישה לקוד שלי, הוא ישיג גם גישה למידע שלי. כל חוקר אבטחה סוג ג׳ יגיד מייד שזה לא רעיון טוב. כאשר יש לנו סודות שאנו רוצים להצפין אותם, מוטב להשתמש ב-Secret manager זה או אחר על מנת לשמור ססמאות ושמות משתמש וכל נתון אחר. זה אפילו לא מסובך במיוחד. הנה דוגמה פשוטה ומהירה שכתבתי יחד עם ידידנו Copilot, לא הייתי משתמש בה ישירות, אבל היא מבהירה כמה זה קל:
# Initialize a session using Amazon Secrets Manager
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name='your_region'
)
# Retrieve secret
secret_name = 'dbCredentials'
get_secret_value_response = client.get_secret_value(SecretId=secret_name)
# Parse and use credentials
if 'SecretString' in get_secret_value_response:
secret = json.loads(get_secret_value_response['SecretString'])
username = secret['username']
password = secret['password']
# Now, use these credentials to connect to your database
connection = mysql.connector.connect(
host='localhost',
database='example_db',
user=username,
password=password
)
חלק מהקוראים יגחכו – ״מה, אם התוקף משיג גישה לקוד שלי, להשיג גישה למידע שלי זו תהיה הבעיה האחרונה שלי״. אבל, וזה אבל חשוב, אפשר להשיג גישה לקוד גם בלי להשיג גישה לשרת. למשל, אם מישהו הצליח לשים יד על הגיט שלכם. במקרה הזה, כל הקוד יהיה חשוף בפניו. נשמע מופרך? זה קורה אינספור פעמים. או בגלל טעות שבגללה הריפוזיטורי נחשף (קורה במיוחד אם אין שימוש ב-GitHub enterprise ואז אפשרי בטעות לגרום לריפוזיטורי להיות ציבורי) או, שבגלל בעיות בדיפלוימנט או בגלל שהדיפלוימנט הוא שימוש ב-SCP או אפילו ב-FTP (כן 😱) מעלים בטעות את התיקיה git. לרשת.
כאשר אנו משתמשים בגיט, יש לנו תיקית git. (הנקודה בהתחלה) שמכילה את כל המידע המקומי של גיט. כיוון שגיט היא מבוזרת, יש שם מספיק מידע כדי לשחזר את הקוד ולבחון אותו. כמה זה נפוץ? ובכן, יש תוסף לכלי הפריצה דפדפן שחושף בפני כל מי שמעוניין בכך את הבושה. הוא נקרא DotGit והוא זמין גם לכרום וגם לפיירפוקס.
מי שישתמש בו יראה כמעט מייד שיש פה משהו ואפילו יוכל להוריד. אפשר גם להוריד, אם מדובר בקובץ גדול, באמצעות הפקודה
wget --mirror - I .git https://the-destination.com/.git/
וכל מה שצריך הוא להקליד git restore וזהו. הקוד פרוס לפני התוקף. ולא רק הקוד – גם הגרסאות השונות והקומיטים השונים. עשיתם טעות בקומיט והכנסתם טוקן או סיסמה בקוד ואז התחרטתם ועשיתם קומיט מתקן? הלוג יגלה את הכל. הערות של הקומיטים? גם, באמצעות git log. זה עושר עצום של מידע.
יש כמובן גם סקאנרים שמבצעים בדיקה של שמות תיקיות, ואפילו שימוש בכלי ההאקינג האימתני גוגל תחת המחרוזת:
"index of" inurl:.git
יביא לכם אתרים כאלו (אם יש להם directory listing פתוח). ויש לא מעט שיטות וטריקים אחרים. אז ככה שאם מישהו בנה על זה ש״איש לא ישים לב״, אז מומלץ שלא.
כמובן שיש גם גיבויים שחשופים להם לפעמים או אפילו אובדן פיזי של מחשב פיתוח. הדברים האלו יכולים לקרות כל הזמן. עלינו לדאוג לקוד מאובטח כל הזמן שגם אם ייחשף, תוקף לא יוכל לעשות יותר מדי נזק.
ולמרות שObscurity is not security, עדיין אנחנו חייבים להמנע מ-Information disclosure – כלומר לתת לתוקף מתנה שלא לצורך וקוד המקור שלנו, היכן שאין צורך תפעולי, הוא מתנה שלא לצורך. שלא לדבר על ההערות והלוגים וההיסטוריה. זה דבר שעדיף שלא יהיה בשרת הפרודקשן שלכם.
זו גם הסיבה שאם עשיתם קומיט, אפילו לוקלי, במערכת שלכם לטוקן, סיסמה או פריט מידע רגיש – חייבים להתייחס לזה כאל חשיפה ולנטרל את הטוקן, לשנות את הסיסמה ולחדש את המידע הרגיש.
כמובן שאם יש לנו מערכת מבוססת על קוד פתוח, חשיפת הקוד היא מחוייבת, אבל גם אז – בגיטהאב ובאופן מסודר ולא ככה.
תגובה אחת
עשיתי בגוגל את החיפוש של "index of" inurl:.git
וזה ממש מוזר לראות אתרים שמעלים ככה את קוד המקור שלהם…