RamenHire ಜಾಬ್ ಬೋರ್ಡ್‌ನಲ್ಲಿನ ಒಂದು 'ಸ್ಟೋರ್ಡ್ HTML ಇಂಜೆಕ್ಷನ್' (stored HTML injection) ದೋಷವು, ಯಾರೇ ಆದರೂ ಸಾರ್ವಜನಿಕ ಫಾರ್ಮ್ ಅನ್ನು ತುಂಬಲು ಮತ್ತು ತಂಡದ ನೋಟಿಫಿಕೇಶನ್ ಇಮೇಲ್‌ಗಳನ್ನು ಫಿಶಿಂಗ್ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್ ಆಗಿ ಪರಿವರ್ತಿಸಲು ಅವಕಾಶ ಮಾಡಿಕೊಟ್ಟಿತು.

ಈ ದೋಷವು ಹೇಗೆ ಉಂಟಾಯಿತು

RamenHire ಎಂಬುದು Next.js ಮತ್ತು Supabase ಮೇಲೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ಸ್ಟಾರ್ಟ್‌ಅಪ್‌ಗಳು ಲಾಗಿನ್ ಆಗದೆಯೇ ಉದ್ಯೋಗಗಳನ್ನು ಪೋಸ್ಟ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ. ಪ್ರತಿಯೊಂದು ಸಬ್ಮಿಷನ್ ಕೂಡ ಆಂತರಿಕ ನೇಮಕಾತಿ ತಂಡಕ್ಕೆ ಇಮೇಲ್ ಕಳುಹಿಸುತ್ತದೆ. ಇಮೇಲ್‌ನ ಬಾಡಿಯನ್ನು ಕಂಪನಿ ಹೆಸರು, ಉದ್ಯೋಗ ವಿವರಣೆ, ಸಂಪರ್ಕದ ಹೆಸರು - ಅಂತಹ ಫಾರ್ಮ್‌ನ ಕಚ್ಚಾ ಫೀಲ್ಡ್‌ಗಳನ್ನು ನೇರವಾಗಿ ಒಂದು HTML ಸ್ಟ್ರಿಂಗ್‌ಗೆ ಜೋಡಿಸುವ ಮೂಲಕ ನಿರ್ಮಿಸಲಾಗುತ್ತದೆ. ಈ ಸ್ಟ್ರಿಂಗ್ ಮೇಲ್ ಸರ್ವಿಸ್‌ಗೆ ತಲುಪುವ ಮೊದಲು ಯಾವುದೇ 'ಎಸ್ಕೇಪಿಂಗ್' (escaping) ಅಥವಾ 'ಸ್ಯಾನಿಟೈಸೇಶನ್' (sanitisation) ನಡೆಯುವುದಿಲ್ಲ.

ಟೆಂಪ್ಲೇಟ್ ಬಳಕೆದಾರರ ಇನ್‌ಪುಟ್ ಅನ್ನು ಸುರಕ್ಷಿತ HTML ಎಂದು ಪರಿಗಣಿಸುವುದರಿಂದ, ದುಷ್ಟ ಉದ್ದೇಶ ಹೊಂದಿರುವ ಅರ್ಜಿದಾರರು ಸುಳ್ಳು “click here to verify” ಲಿಂಕ್ ಅನ್ನು ಇಂಜೆಕ್ಟ್ ಮಾಡಬಹುದು. ಈ ಪೇಲೋಡ್ (payload) ಉದ್ಯೋಗ ಪಟ್ಟಿಯ ಭಾಗವಾಗಿ ಸರ್ವರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ ನಂತರದ ಪ್ರತಿಯೊಂದು ನೋಟಿಫಿಕೇಶನ್ ಇಮೇಲ್ ಕೂಡ ಈ ದುಷ್ಟ ಕೋಡ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ದಾಳಿಕಾರನು ಆ ಲಿಂಕ್ ಅನ್ನು ನಿಜವಾದ “View Dashboard” ಬಟನ್ ಪಕ್ಕದಲ್ಲಿ ಅಡಗಿಸಿಟ್ಟು, ತಂಡದ ಸದಸ್ಯರನ್ನು ವಂಚಿಸಿ ಅವರ ಕ್ರೆಡೆನ್ಶಿಯಲ್‌ಗಳನ್ನು (credentials) ಬಹಿರಂಗಪಡಿಸುವಂತೆ ಅಥವಾ ಫಿಶಿಂಗ್ ಸೈಟ್‌ಗೆ ಭೇಟಿ ನೀಡುವಂತೆ ಮಾಡಬಹುದು.

ಇದು ಏಕೆ ಮುಖ್ಯವಾಯಿತು

ಈ ಇಮೇಲ್‌ಗಳು ಪ್ರಮುಖ ನೇಮಕಾತಿ ತಂಡಕ್ಕೆ ಹೋಗುತ್ತವೆ, ಅಂದರೆ ಅಭ್ಯರ್ಥಿಗಳನ್ನು ಮುಂದಿನ ಹಂತಕ್ಕೆ ಕಳುಹಿಸಲು ನಿರಂತರವಾಗಿ ಲಿಂಕ್‌ಗಳನ್ನು ಕ್ಲಿಕ್ ಮಾಡುವ ವ್ಯಕ್ತಿಗಳಿಗೆ ಇವು ತಲುಪುತ್ತವೆ.

ತಾಂತ್ರಿಕ ಕೊರತೆ

HTML ಎಸ್ಕೇಪಿಂಗ್ ಎಂಬುದು ಕೇವಲ ಒಂದು ಹಂತವಲ್ಲ. ಎರಡು ಸಂದರ್ಭಗಳಲ್ಲಿ ರಕ್ಷಣೆ ಅಗತ್ಯವಿದೆ:

  • Text nodes – ಟ್ಯಾಗ್‌ಗಳ ನಡುವಿನ ವಿಷಯ (content). < ಅನ್ನು &lt; ಗೆ ಮತ್ತು > ಅನ್ನು &gt; ಗೆ ಪರಿವರ್ತಿಸುವುದು ಟ್ಯಾಗ್‌ಗಳನ್ನು ತಡೆಯುತ್ತದೆ, ಆದರೆ ಅಟ್ರಿಬ್ಯೂಟ್ ವ್ಯಾಲ್ಯೂ (attribute value) ಯಿಂದ ಹೊರಬರಲು ದಾಳಿಕಾರನನ್ನು ತಡೆಯುವುದಿಲ್ಲ.
  • Attribute valueshref="…" ನಂತಹ ಟ್ಯಾಗ್‌ಗಳ ಒಳಗಿರುವ ಸ್ಟ್ರಿಂಗ್‌ಗಳು. ಒಂದು ಕೊಟೇಶನ್ ಮಾರ್ಕ್ (" ಅಥವಾ ') ಅನ್ನು ಇಂಜೆಕ್ಟ್ ಮಾಡುವುದರಿಂದ ದಾಳಿಕಾರನು ಅಟ್ರಿಬ್ಯೂಟ್ ಅನ್ನು ಮೊದಲೇ ಮುಗಿಸಿ ತನ್ನದೇ ಆದ ಮಾರ್ಕ್‌ಅಪ್ ಅನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.

ಮೂಲ ಕೋಡ್ ಕೇವಲ ಪ್ಲೇನ್ ಟೆಕ್ಸ್ಟ್ ಅನ್ನು ಮಾತ್ರ ನಿರ್ವಹಿಸುತ್ತಿತ್ತು, ಇದರಿಂದ ಅಟ್ರಿಬ್ಯೂಟ್ ಇಂಜೆಕ್ಷನ್ ಅನ್ನು ತಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.

ಸಮಸ್ಯೆಯನ್ನು ಸರಿಪಡಿಸುವುದು

ಡೆವಲಪರ್ ಒಂದು ಸಣ್ಣ escapeHtml ಹೆಲ್ಪರ್ ಅನ್ನು ಸೇರಿಸಿದರು ಮತ್ತು ಬಳಕೆದಾರರು ನೀಡಿದ ಪ್ರತಿಯೊಂದು ವ್ಯಾಲ್ಯೂ ಅನ್ನು ಇಂಟರ್‌ಪೊಲೇಶನ್ (interpolation) ಮಾಡುವ ಮೊದಲು ಅನ್ವಯಿಸಿದರು, ಆ ವ್ಯಾಲ್ಯೂ ಟೆಕ್ಸ್ಟ್ ನೋಡ್‌ನಲ್ಲಿರಲಿ ಅಥವಾ ಅಟ್ರಿಬ್ಯೂಟ್‌ನಲ್ಲಿರಲಿ.

ಪರಿಶೀಲನಾ ಹಂತಗಳು

  • Local testing – ಟೆಂಪ್ಲೇಟ್ ಫಂಕ್ಷನ್‌ಗಳಿಗೆ ಹಲವಾರು ಇಂಜೆಕ್ಷನ್ ಸ್ಟ್ರಿಂಗ್‌ಗಳನ್ನು ನೀಡಲಾಯಿತು. ಪ್ರತಿ ಪರೀಕ್ಷೆಯು ಕೇವಲ ಎಸ್ಕೇಪ್ ಮಾಡಿದ ಅಕ್ಷರಗಳನ್ನು ತೋರಿಸಿತು, ಯಾವುದೇ ಎಕ್ಸಿಕ್ಯೂಟಬಲ್ (executable) ಟ್ಯಾಗ್‌ಗಳು ಕಂಡುಬರಲಿಲ್ಲ.
  • Production testing – ಪ್ಯಾಚ್ ಅನ್ನು ಅಳವಡಿಸಿದ ನಂತರ, ಲೈವ್ ಸೈಟ್ ಮೂಲಕ ಒಂದು ಪೇಲೋಡ್ ಅನ್ನು ಸಬ್ಮಿಟ್ ಮಾಡಲಾಯಿತು, ಇದು Cloudflare Turnstile ಬಾಟ್ ಚೆಕ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪಾಸಾಯಿತು. ಅದರ ಪರಿಣಾಮವಾಗಿ ಬಂದ ಇಮೇಲ್ ಡೆವಲಪರ್‌ನ ಇನ್‌ಬಾಕ್ಸ್‌ಗೆ ತಲುಪಿತು; ದುಷ್ಟ ಲಿಂಕ್ ಮತ್ತು ಯಾವುದೇ ಸ್ಕ್ರಿಪ್ಟ್ ಟ್ಯಾಗ್‌ಗಳು ಕ್ಲಿಕ್ ಮಾಡಬಹುದಾದ ಎಲಿಮೆಂಟ್‌ಗಳಾಗಿ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಬದಲು, ಅಸ್ಪಷ್ಟ ಪಠ್ಯದಂತೆ (garbled text) ಕಾಣಿಸಿಕೊಂಡವು.

Gmail ಬಗ್ಗೆ ಒಂದು ಸೂಚನೆ: ಈ ಸೇವೆಯು URL ಅನ್ನು ನೀಲಿ ಬಣ್ಣದಲ್ಲಿ ತೋರಿಸಿ ಕ್ಲಿಕ್ ಮಾಡಬಹುದಾದಂತೆ ಮಾಡಬಹುದು, ಆದರೆ ಅದು ಕ್ಲೈಂಟ್-ಸೈಡ್ ಸೌಲಭ್ಯವಷ್ಟೇ ಹೊರತು HTML ಇಂಜೆಕ್ಷನ್ ಯಶಸ್ವಿಯಾಗಿದೆ ಎಂದಲ್ಲ. ಈ ಪರಿಹಾರವು ನಿಜವಾದ ಬಟನ್‌ಗಳನ್ನು ರಚಿಸುವುದನ್ನು ಅಥವಾ ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳನ್ನು ರನ್ ಮಾಡುವುದನ್ನು ತಡೆಯುತ್ತದೆ.

ಡೆವಲಪರ್‌ಗಳು ಗಮನಿಸಬೇಕಾದ ಅಂಶಗಳು

  • ಸಾರ್ವಜನಿಕ ಫಾರ್ಮ್‌ಗಳಿಂದ ಬರುವ ಡೇಟಾವನ್ನು ಎಂದಿಗೂ ನಂಬಬೇಡಿ – ಸಾಮಾನ್ಯವಾಗಿ ಕಾಣುವ ಫಾರ್ಮ್‌ಗಳು ಕೂಡ ಬೇರೆಡೆ ಬಳಸಲಾಗುವ ಸ್ಟೋರ್ಡ್ ಔಟ್‌ಪುಟ್ ಅನ್ನು ಸೃಷ್ಟಿಸಬಹುದು.
  • ಬಳಕೆಯ ಸಮಯದಲ್ಲಿ ಎಸ್ಕೇಪ್ ಮಾಡಿ – ರೆಂಡರಿಂಗ್ ಮಾಡುವ ಮೊದಲು ಸರಿಯಾದ ಸಂದರ್ಭಕ್ಕೆ ಅನುಗುಣವಾಗಿ (text vs. attribute) ಎಸ್ಕೇಪಿಂಗ್ ಅನ್ವಯಿಸಿ, ಪೈಪ್‌ಲೈನ್‌ನ ಆರಂಭದಲ್ಲಿ ಅಲ್ಲ.
  • ಕ್ಲೈಂಟ್-ಸೈಡ್ ಮತ್ತು ಸರ್ವರ್-ಸೈಡ್ ಎರಡನ್ನೂ ಪರೀಕ್ಷಿಸಿ – ಯೂನಿಟ್ ಟೆಸ್ಟ್‌ಗಳು ಸ್ಪಷ್ಟವಾದ ವೈಫಲ್ಯಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುತ್ತವೆ; ಲೈವ್ UI ಮೂಲಕ ಮಾಡುವ ಮ್ಯಾನುಯಲ್ ಎಂಡ್-ಟು-ಎಂಡ್ ಪರೀಕ್ಷೆಯು ನೈಜ ಟ್ರಾಫಿಕ್‌ನಲ್ಲಿ ರಕ್ಷಣೆಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
  • ಇಮೇಲ್ ಕ್ಲೈಂಟ್‌ನ ವಿಶಿಷ್ಟ ಗುಣಲಕ್ಷಣಗಳ ಬಗ್ಗೆ ಜಾಗೃತರಾಗಿರಿ – ಕೆಲವು ಕ್ಲೈಂಟ್‌ಗಳು URLಗಳನ್ನು ಆಟೋ-ಲಿಂಕ್ ಮಾಡುತ್ತವೆ, ಇದು ಸುಳ್ಳು ಭದ್ರತೆಯ ಭಾವನೆಯನ್ನು ನೀಡಬಹುದು. ಅಡಗಿರುವ HTML ಯಾವುದೇ ಆಕ್ಟಿವ್ ಎಲಿಮೆಂಟ್‌ಗಳನ್ನು ಹೊಂದಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.

ಸಾರಾಂಶ

ಬಳಕೆದಾರರ ಇನ್‌ಪುಟ್ ನಿರ್ವಹಣೆಯಲ್ಲಿನ ಒಂದು ಸಣ್ಣ ಅಜಾಗರೂಕತೆಯು ಸಾಮಾನ್ಯ ನೋಟಿಫಿಕೇಶನ್ ಇಮೇಲ್‌ಗಳನ್ನು ಫಿಶಿಂಗ್ ವೆಕ್ಟರ್ ಆಗಿ ಬದಲಾಯಿಸಿತು. ಸಮಗ್ರವಾದ HTML-ಎಸ್ಕೇಪಿಂಗ್ ರೂಟೀನ್ ಅನ್ನು ಪರಿಚಯಿಸುವುದು ಮತ್ತು ಸ್ಥಳೀಯವಾಗಿ ಹಾಗೂ ಪ್ರೊಡಕ್ಷನ್‌ನಲ್ಲಿ ಪರಿಹಾರವನ್ನು ಪರಿಶೀಲಿಸುವುದು ಇನ್‌ಬಾಕ್ಸ್‌ನ ಸಮಗ್ರತೆಯನ್ನು ಮರುಸ್ಥಾಪಿಸಿತು. ನಂಬಲಾರದ ಡೇಟಾದಿಂದ HTML ಅನ್ನು ಸೃಷ್ಟಿಸುವ ಯಾವುದೇ ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಈ ಘಟನೆಯು ಒಂದು ಶಾಶ್ವತ ಪಾಠವನ್ನು ಕಲಿಸುತ್ತದೆ: ಸರಿಯಾದ ಸ್ಯಾನಿಟೈಸೇಶನ್ ಅನಿವಾರ್ಯ ಮತ್ತು ಅದನ್ನು ನಿರ್ಲಕ್ಷಿಸುವುದು ನಿಮ್ಮ ಬಳಕೆದಾರರ ಇನ್‌ಬಾಕ್ಸ್‌ಗಳಿಗೆ ನೇರ ದಾರಿಯನ್ನು ಮಾಡಿಕೊಡಬಹುದು.