RamenHire જોબ બોર્ડમાં રહેલી એક 'સ્ટોર્ડ HTML ઇન્જેક્શન' (stored HTML injection) બગને કારણે કોઈપણ વ્યક્તિ જાહેર ફોર્મ ભરી શકતી હતી અને ટીમની નોટિફિકેશન ઈમેલને ફિશિંગ પ્લેટફોર્મમાં બદલી શકતી હતી.

આ બગ કેવી રીતે ઘૂસી આવ્યો

RamenHire Next.js અને Supabase પર ચાલે છે અને સ્ટાર્ટઅપ્સને લોગિન કર્યા વગર જોબ પોસ્ટ કરવાની સુવિધા આપે છે. દરેક સબમિશન આંતરિક હાયરિંગ ટીમને એક ઈમેલ મોકલે છે. ઈમેલ બોડીમાં કંપનીનું નામ, જોબ ડિસ્ક્રિપ્શન, સંપર્કનું નામ જેવા કાચા ફોર્મ ફીલ્ડ્સને સીધા જ HTML સ્ટ્રિંગમાં જોડીને બનાવવામાં આવે છે. સ્ટ્રિંગ મેઈલ સર્વિસ સુધી પહોંચે તે પહેલાં કોઈ એસ્કેપિંગ (escaping) અથવા સેનિટાઈઝેશન (sanitisation) કરવામાં આવતું નથી.

કારણ કે ટેમ્પલેટ યુઝરના ઇનપુટને સુરક્ષિત HTML તરીકે ગણે છે, તેથી એક દુષ્ટ અરજદાર ખોટી “click here to verify” લિંક ઇન્જેક્ટ કરી શકે છે. આ પેલોડ (payload) સર્વર પર જોબ લિસ્ટિંગના ભાગ તરીકે સ્ટોર થાય છે, તેથી ત્યારપછીના દરેક નોટિફિકેશન ઈમેલમાં આ હાનિકારક કોડ હોય છે. હુમલાખોર તે લિંકને અસલી “View Dashboard” બટનની બાજુમાં છુપાવી શકે છે, જેનાથી ટીમ મેમ્બરને છેતરીને તેમની ઓળખ (credentials) મેળવી શકાય અથવા તેમને ફિશિંગ સાઇટ પર મોકલી શકાય છે.

આ કેમ મહત્વનું હતું

આ ઈમેલ મુખ્ય હાયરિંગ ક્રૂને જાય છે, જે લોકો ઉમેદવારોને પ્રોસેસમાં આગળ વધારવા માટે સતત લિંક્સ પર ક્લિક કરતા હોય છે.

ટેકનિકલ ખામી

HTML એસ્કેપિંગ એ માત્ર એક સ્ટેપ નથી. બે સંદર્ભો (contexts) ને સુરક્ષાની જરૂર છે:

  • Text nodes – ટેગ્સ વચ્ચેનું કન્ટેન્ટ. < ને &lt; માં અને > ને &gt; માં રૂપાંતરિત કરવાથી ટેગ્સ અટકે છે, પરંતુ તે હુમલાખોરને એટ્રિબ્યુટ વેલ્યુમાંથી બહાર નીકળતા અટકાવતું નથી.
  • Attribute values – ટેગ્સની અંદરની સ્ટ્રિંગ્સ જેમ કે href="…". ક્વોટ (" અથવા ') ઇન્જેક્ટ કરવાથી હુમલાખોર એટ્રિબ્યુટને વહેલા બંધ કરી શકે છે અને પોતાનું માર્કઅપ ઉમેરી શકે છે.

મૂળ કોડ ફક્ત પ્લેન ટેક્સ્ટને હેન્ડલ કરતો હતો, જેના કારણે એટ્રિબ્યુટ ઇન્જેક્શન માટે રસ્તો ખુલ્લો રહી ગયો હતો.

સમસ્યાનું નિરાકરણ

ડેવલપરે એક નાનું escapeHtml હેલ્પર ઉમેર્યું અને ઇન્ટરપોલેશન (interpolation) પહેલાં દરેક યુઝર-સપ્લાય કરેલી વેલ્યુ પર તેનો ઉપયોગ કર્યો, પછી ભલે તે વેલ્યુ ટેક્સ્ટ નોડમાં હોય કે એટ્રિબ્યુટમાં.

વેરિફિકેશન સ્ટેપ્સ

  • Local testing – ટેમ્પલેટ ફંક્શન્સમાં ઇન્જેક્શન સ્ટ્રિંગ્સનો સેટ મોકલવામાં આવ્યો. દરેક ટેસ્ટમાં ફક્ત એસ્કેપ કરેલા કેરેક્ટર્સ જ દેખાયા, કોઈ એક્ઝિક્યુટેબલ ટેગ્સ નહીં.
  • Production testing – પેચ ડિપ્લોય કર્યા પછી, લાઈવ સાઇટ દ્વારા એક પેલોડ સબમિટ કરવામાં આવ્યો, જે Cloudflare Turnstile બોટ ચેક પાસ કરી ગયો. પરિણામી ઈમેલ ડેવલપરના ઇનબોક્સમાં પહોંચ્યો; હાનિકારક લિંક અને કોઈપણ સ્ક્રિપ્ટ ટેગ્સ અસ્પષ્ટ ટેક્સ્ટ તરીકે દેખાયા, ક્લિક કરી શકાય તેવા એલિમેન્ટ્સ તરીકે નહીં.

Gmail વિશે નોંધ: સર્વિસ હજુ પણ URL ને બ્લુ રંગ આપી શકે છે અને તેને ક્લિક કરી શકાય તેવું બનાવી શકે છે, પરંતુ તે ક્લાયન્ટ-સાઇડની સુવિધા છે અને તેનો અર્થ એ નથી કે HTML ઇન્જેક્શન સફળ થયું છે. આ ફિક્સ ઇન્જેક્શનને અસલી બટન બનાવતા અથવા સ્ક્રિપ્ટ ચલાવતા અટકાવે છે.

ડેવલપર્સે શેનું ધ્યાન રાખવું જોઈએ

  • જાહેર ફોર્મ્સના ડેટા પર ક્યારેય વિશ્વાસ ન કરો – નિર્દોષ દેખાતા ફોર્મ્સ પણ એવી સ્ટોર્ડ આઉટપુટ પેદા કરી શકે છે જેનો ઉપયોગ અન્ય જગ્યાએ થઈ શકે છે.
  • ઉપયોગના સમયે એસ્કેપ કરો – રેન્ડરિંગના બરાબર પહેલાં કોન્ટેક્સ્ટ-અવેર એસ્કેપિંગ (ટેક્સ્ટ વિરુદ્ધ એટ્રિબ્યુટ) લાગુ કરો, પાઇપલાઇનમાં વહેલા નહીં.
  • ક્લાયન્ટ-સાઇડ અને સર્વર-સાઇડ બંનેનું ટેસ્ટિંગ કરો – યુનિટ ટેસ્ટ સ્પષ્ટ નિષ્ફળતાઓ પકડી લે છે; લાઈવ UI દ્વારા મેન્યુઅલ એન્ડ-ટુ-એન્ડ ટેસ્ટ એ વાતની ખાતરી કરે છે કે વાસ્તવિક ટ્રાફિક હેઠળ સુરક્ષા વ્યવસ્થા ટકી રહે છે.
  • ઈમેલ ક્લાયન્ટની વિચિત્રતાઓ વિશે જાગૃત રહો – કેટલાક ક્લાયન્ટ્સ URL ને ઓટો-લિંક કરે છે, જે સુરક્ષાનો ખોટો અહેસાસ કરાવે છે. ખાતરી કરો કે અન્ડરલાઇંગ HTML માં કોઈ એક્ટિવ એલિમેન્ટ્સ નથી.

નિષ્કર્ષ

યુઝર ઇનપુટ હેન્ડલ કરવામાં થયેલી એક નાની ભૂલને કારણે રૂટિન નોટિફિકેશન ઈમેલ ફિશિંગ વેક્ટર બની ગયા. એક વ્યાપક HTML-એસ્કેપિંગ રૂટિન દાખલ કરવાથી અને લોકલી તથા પ્રોડક્શનમાં ફિક્સને વેલિડેટ કરવાથી ઇનબોક્સની અખંડિતતા પુનઃસ્થાપિત થઈ. આ ઘટના કોઈપણ વેબ એપ માટે એક કાયમી પાઠ સમજાવે છે જે અનટ્રસ્ટેડ ડેટામાંથી HTML જનરેટ કરે છે: યોગ્ય સેનિટાઈઝેશન અનિવાર્ય છે, અને તેને અવગણવાથી તમારા યુઝર્સના ઇનબોક્સ સુધી સીધો રસ્તો ખુલી શકે છે.