RamenHire జాబ్ బోర్డ్‌లో ఉన్న ఒక స్టోర్డ్ HTML ఇంజెక్షన్ బగ్ (stored HTML injection bug), ఎవరైనా పబ్లిక్ ఫారమ్‌ను నింపేలా చేసి, టీమ్ నోటిఫికేషన్ ఈమెయిల్స్‌ను ఫిషింగ్ ప్లాట్‌ఫామ్‌గా మార్చేలా చేసింది.

ఈ బగ్ ఎలా చోటుచేసుకుంది

RamenHire, Next.js మరియు Supabase పై నడుస్తుంది మరియు స్టార్టప్‌లు లాగిన్ అవ్వకుండానే ఉద్యోగాలను పోస్ట్ చేయడానికి అనుమతిస్తుంది. ప్రతి సబ్మిషన్ అంతర్గత హైరింగ్ టీమ్‌కు ఒక ఈమెయిల్‌ను పంపుతుంది. ఈమెయిల్ బాడీని కంపెనీ పేరు, జాబ్ డిస్క్రిప్షన్, కాంటాక్ట్ నేమ్ వంటి ఫారమ్ ఫీల్డ్‌లను నేరుగా ఒక HTML స్ట్రింగ్‌లోకి కలిపి నిర్మిస్తారు. ఈ స్ట్రింగ్ మెయిల్ సర్వీస్‌కు చేరుకునే ముందు ఎటువంటి ఎస్కేపింగ్ (escaping) లేదా శానిటైజేషన్ (sanitisation) జరగదు.

టెంప్లేట్ యూజర్ ఇన్‌పుట్‌ను సురక్షితమైన HTMLగా పరిగణించడం వల్ల, ఒక దుర్మార్గపు అభ్యర్థి (malicious applicant) నకిలీ “click here to verify” లింక్‌ను ఇంజెక్ట్ చేయగలరు. ఈ పేలోడ్ (payload) జాబ్ లిస్టింగ్‌లో భాగంగా సర్వర్‌లో స్టోర్ అవుతుంది, కాబట్టి తదుపరి వచ్చే ప్రతి నోటిఫికేషన్ ఈమెయిల్‌లో ఆ హానికరమైన కోడ్ ఉంటుంది. ఒక అటాకర్ ఆ లింక్‌ను అసలైన “View Dashboard” బటన్ పక్కన దాచిపెట్టి, టీమ్ సభ్యులను మోసం చేసి వారి క్రెడెన్షియల్స్ (credentials) బయటపెట్టేలా లేదా ఫిషింగ్ సైట్‌ను సందర్శించేలా చేయవచ్చు.

ఇది ఎందుకు ముఖ్యం

ఈ ఈమెయిల్స్ ప్రధాన హైరింగ్ క్రూ (hiring crew) కి వెళ్తాయి, వీరు అభ్యర్థులను తదుపరి దశలకు పంపడానికి నిరంతరం లింక్‌లను క్లిక్ చేస్తూ ఉంటారు.

సాంకేతిక లోపం

HTML ఎస్కేపింగ్ అనేది ఒకే దశతో ముగిసేది కాదు. రెండు సందర్భాలలో రక్షణ అవసరం:

  • Text nodes – ట్యాగ్‌ల మధ్య ఉండే కంటెంట్. < ను &lt; గా మరియు > ను &gt; గా మార్చడం వల్ల ట్యాగ్‌లను ఆపవచ్చు, కానీ ఒక అటాకర్ అట్రిబ్యూట్ వాల్యూ (attribute value) నుండి బయటకు వచ్చేలా చేయడాన్ని ఇది ఆపలేదు.
  • Attribute valueshref="…" వంటి ట్యాగ్‌ల లోపల ఉండే స్ట్రింగ్స్. ఒక కోట్ (" లేదా ') ఇంజెక్ట్ చేయడం ద్వారా అటాకర్ అట్రిబ్యూట్‌ను త్వరగా క్లోజ్ చేసి, వారి స్వంత మార్కప్‌ను (markup) చేర్చవచ్చు.

అసలు కోడ్ కేవలం ప్లెయిన్ టెక్స్ట్‌ను మాత్రమే హ్యాండిల్ చేసేది, దీనివల్ల అట్రిబ్యూట్ ఇంజెక్షన్ (attribute injection)కు అవకాశం ఏర్పడింది.

సమస్యను పరిష్కరించడం

డెవలపర్ ఒక చిన్న escapeHtml హెల్పర్ ఫంక్షన్‌ను జోడించి, యూజర్ అందించిన ప్రతి విలువను (అది టెక్స్ట్ నోడ్‌లో ఉన్నా లేదా అట్రిబ్యూట్‌లో ఉన్నా) ఇంటర్పోలేషన్ (interpolation) చేయడానికి ముందే దానికి వర్తింపజేశారు.

వెరిఫికేషన్ దశలు

  • Local testing – టెంప్లేట్ ఫంక్షన్‌లకు వివిధ రకాల ఇంజెక్షన్ స్ట్రింగ్స్‌ను పంపారు. ప్రతి పరీక్షలో కేవలం ఎస్కేప్ చేయబడిన క్యారెక్టర్లు మాత్రమే కనిపించాయి, ఎటువంటి ఎగ్జిక్యూటబుల్ ట్యాగ్‌లు (executable tags) కనిపించలేదు.
  • Production testing – ప్యాచ్‌ను డిప్లాయ్ చేసిన తర్వాత, లైవ్ సైట్ ద్వారా ఒక పేలోడ్‌ను సబ్మిట్ చేశారు, ఇది Cloudflare Turnstile బాట్ చెక్‌ను కూడా దాటింది. ఫలితంగా వచ్చిన ఈమెయిల్ డెవలపర్ ఇన్‌బాక్స్‌కు చేరింది; అందులో హానికరమైన లింక్ మరియు స్క్రిప్ట్ ట్యాగ్‌లు క్లిక్ చేయగల ఎలిమెంట్స్‌లా కాకుండా, అర్థం లేని టెక్స్ట్‌లా (garbled text) కనిపించాయి.

Gmail గురించి ఒక గమనిక: ఆ సర్వీస్ ఇప్పటికీ URLను నీలం రంగులో చూపించి, క్లిక్ చేసేలా చేయవచ్చు, కానీ అది క్లయింట్-సైడ్ సౌకర్యం మాత్రమే, దీని అర్థం HTML ఇంజెక్షన్ విజయవంతమైందని కాదు. ఈ పరిష్కారం ఇంజెక్షన్ ద్వారా నిజమైన బటన్‌లను సృష్టించడాన్ని లేదా స్క్రిప్ట్‌లను రన్ చేయడాన్ని నిరోధిస్తుంది.

డెవలపర్లు గమనించవలసినవి

  • పబ్లిక్ ఫారమ్‌ల నుండి వచ్చే డేటాను ఎప్పుడూ నమ్మవద్దు – అమాయకంగా కనిపించే ఫారమ్‌లు కూడా ఇతర చోట్ల ఉపయోగించబడే స్టోర్డ్ అవుట్‌పుట్‌ను సృష్టించగలవు.
  • ఉపయోగించే సమయంలోనే ఎస్కేప్ చేయండి – రెండరింగ్ (rendering) చేయడానికి సరిగ్గా ముందే కాంటెక్స్ట్-అవేర్ ఎస్కేపింగ్‌ను (text vs. attribute) వర్తింపజేయండి, పైప్‌లైన్‌లో అంతకంటే ముందు కాదు.
  • క్లయింట్-సైడ్ మరియు సర్వర్-సైడ్ రెండింటినీ పరీక్షించండి – యూనిట్ టెస్ట్‌లు స్పష్టమైన వైఫల్యాలను గుర్తిస్తాయి; లైవ్ UI ద్వారా మాన్యువల్ ఎండ్-టు-ఎండ్ టెస్ట్ చేయడం వల్ల నిజమైన ట్రాఫిక్ ఉన్నప్పుడు రక్షణ వ్యవస్థ సరిగ్గా పనిచేస్తుందో లేదో నిర్ధారించుకోవచ్చు.
  • ఈమెయిల్ క్లయింట్ ప్రత్యేకతలను గమనించండి – కొన్ని క్లయింట్లు URLలను ఆటోమేటిక్‌గా లింక్‌లుగా మారుస్తాయి, ఇది తప్పుడు భద్రతా భావాన్ని కలిగించవచ్చు. లోపల ఉన్న HTMLలో ఎటువంటి యాక్టివ్ ఎలిమెంట్స్ లేవని నిర్ధారించుకోండి.

ముగింపు

యూజర్ ఇన్‌పుట్‌ను హ్యాండిల్ చేయడంలో జరిగిన ఒక చిన్న పొరపాటు, సాధారణ నోటిఫికేషన్ ఈమెయిల్స్‌ను ఫిషింగ్ వెక్టార్‌గా మార్చేసింది. సమగ్రమైన HTML-ఎస్కేపింగ్ విధానాన్ని ప్రవేశపెట్టడం మరియు లోకల్‌గా మరియు ప్రొడక్షన్‌లో ఆ పరిష్కారాన్ని ధృవీకరించడం ద్వారా ఇన్‌బాక్స్ సమగ్రతను (integrity) పునరుద్ధరించారు. నమ్మదగని డేటా నుండి HTMLని రూపొందించే ఏ వెబ్ యాప్‌కైనా ఈ సంఘటన ఒక శాశ్వత పాఠాన్ని నేర్పుతుంది: సరైన శానిటైజేషన్ అనేది తప్పనిసరి, దానిని విస్మరించడం మీ వినియోగదారుల ఇన్‌బాక్స్‌లకు నేరుగా దారి తీయవచ్చు.