पाठ 9 / 28

नियम: मॉडल आउटपुट को user इनपुट की तरह मानें

मॉडल जो भी बनाए उस पर क्लासिक injection बचाव लागू करें।

जहाँ आउटपुट बहता है, हमले पीछे आते हैं

यदि मॉडल आउटपुट किसी अन्य घटक में बहता है, तो जो हमलावर मॉडल को प्रभावित कर सके (अपने संदेश से या मॉडल द्वारा पढ़ी सामग्री में पाठ रखकर) वह नियंत्रित कर सकता है कि वह घटक क्या पाता है। मॉडल आउटपुट से SQL query, HTML page, shell command, file path या URL की string बनाएँ और आप क्लासिक injection bugs दोबारा बनाते हैं: SQL injection, cross-site scripting (XSS), command injection, path traversal और server-side request forgery (SSRF)। उपाय वही है, हर सिंक पर लागू: strings से कोड कभी न बनाएँ; parameterised queries, आउटपुट encoding/escaping, shells की जगह argument lists, अनुमत base folder के साथ path canonicalisation, और hosts के लिए allow-lists उपयोग करें। मॉडल आउटपुट को schema से भी validate करें और विफल validation को त्रुटि मानें, अनुमान से बचने की चीज़ नहीं।

मॉडल आउटपुट अविश्वसनीय इनपुट है

मॉडल जो लिखे उसे हमलावर आकार दे सकता है, इसलिए दूसरे system तक पहुँचने से पहले उसे escape, parameterise और validate करें।

पाँच सिंक: SQL, HTML, shell, files, URLs।
चित्र 3.1 — SQL, HTML, shell, files और URLs।

सिंक और उनके बचाव

हर पंक्ति मॉडल आउटपुट पर लागू क्लासिक bug है।

Sink (where output goes)     Attack if built from strings        Defence
SQL query                     SQL injection                       parameterised queries (?)
HTML page                     XSS (script in the reply)           escape / sanitise; strict CSP
shell command                 command injection                   no shell; argument list; allow-list of commands
file path                     path traversal (../../secret)       realpath + must stay inside allowed folder
URL fetched by a tool         SSRF (internal/metadata hosts)      https + host allow-list; block private ranges
code / eval / template        arbitrary code execution            never eval; sandbox if code must run

Schema से validate करें

संरचित आउटपुट माँगें और जो मेल न खाए उसे अस्वीकार करें, मॉडल का आशय अनुमान लगाने की जगह।

त्वरित जाँच: डेटाबेस query बनाने में मॉडल आउटपुट के साथ कैसा व्यवहार करें?

  • चलाने योग्य कच्चे SQL के रूप में
  • भरोसेमंद, क्योंकि मॉडल ने लिखा
  • अविश्वसनीय इनपुट के रूप में, parameterised queries से
  • Password के रूप में
Answer

अविश्वसनीय इनपुट के रूप में, parameterised queries से — मॉडल से आया होना पाठ को सुरक्षित नहीं बनाता।