RamenHire ജോബ് ബോർഡിലെ ഒരു സ്റ്റോർഡ് HTML ഇൻജക്ഷൻ ബഗ് (stored HTML injection bug), ആർക്കും ഒരു പബ്ലിക് ഫോം പൂരിപ്പിക്കാനും ടീമിന്റെ നോട്ടിഫിക്കേഷൻ ഇമെയിലുകളെ ഒരു ഫിഷിംഗ് പ്ലാറ്റ്‌ഫോമായി (phishing platform) മാറ്റാനും അവസരം നൽകി.

ബഗ് എങ്ങനെ സംഭവിച്ചു

Next.js, Supabase എന്നിവയിലാണ് RamenHire പ്രവർത്തിക്കുന്നത്, ഇത് സ്റ്റാർട്ടപ്പുകൾക്ക് ലോഗിൻ ചെയ്യാതെ തന്നെ ജോലികൾ പോസ്റ്റ് ചെയ്യാൻ അനുവദിക്കുന്നു. ഓരോ സബ്മിഷനും ഇന്റേണൽ ഹയറിംഗ് ടീമിന് ഒരു ഇമെയിൽ അയക്കുന്നു. കമ്പനിയുടെ പേര്, ജോബ് ഡിസ്ക്രിപ്ഷൻ, കോൺടാക്റ്റ് പേര് എന്നിങ്ങനെയുള്ള ഫോം ഫീൽഡുകൾ നേരിട്ട് ഒരു HTML സ്ട്രിംഗിലേക്ക് ചേർത്ത് ഇമെയിൽ ബോഡി നിർമ്മിക്കുന്നു. ഈ സ്ട്രിംഗ് മെയിൽ സർവീസിലേക്ക് എത്തുന്നതിന് മുമ്പ് അതിൽ 'escaping' അല്ലെങ്കിൽ 'sanitisation' ഒന്നും ചെയ്യുന്നില്ല.

ടെംപ്ലേറ്റ് ഉപയോക്താവിന്റെ ഇൻപുട്ടിനെ സുരക്ഷിതമായ HTML ആയി കണക്കാക്കുന്നതിനാൽ, ഒരു ദുരുദ്ദേശ്യപൂർണ്ണനായ അപേക്ഷകന് വ്യാജമായ “click here to verify” ലിങ്ക് ഇൻജക്ട് ചെയ്യാൻ കഴിയും. ഈ പേലോഡ് (payload) ജോബ് ലിസ്റ്റിംഗിന്റെ ഭാഗമായി സെർവറിൽ സേവ് ചെയ്യപ്പെടുന്നു, അതിനാൽ തുടർന്നുള്ള എല്ലാ നോട്ടിഫിക്കേഷൻ ഇമെയിലുകളിലും ഈ മാലീഷ്യസ് കോഡ് ഉണ്ടാകും. ഒരു അറ്റാക്കർക്ക് ആ ലിങ്ക് യഥാർത്ഥ “View Dashboard” ബട്ടണിന് അടുത്തായി ഒളിപ്പിച്ചു വെക്കാം, ഇത് ടീം അംഗങ്ങളെ ചതിച്ച് അവരുടെ ക്രെഡൻഷ്യലുകൾ (credentials) വെളിപ്പെടുത്താനോ അല്ലെങ്കിൽ ഒരു ഫിഷിംഗ് സൈറ്റ് സന്ദർശിക്കാനോ പ്രേരിപ്പിക്കും.

എന്തുകൊണ്ട് ഇത് പ്രധാനമായി

ഉദ്യോഗാർത്ഥികളെ അടുത്ത ഘട്ടങ്ങളിലേക്ക് എത്തിക്കുന്നതിനായി നിരന്തരം ലിങ്കുകളിൽ ക്ലിക്ക് ചെയ്യുന്ന പ്രധാന ഹയറിംഗ് ടീമിനാണ് ഈ ഇമെയിലുകൾ ലഭിക്കുന്നത്.

സാങ്കേതികമായ പോരായ്മ

HTML എസ്കേപ്പിംഗ് (Escaping) എന്നത് ഒരു ഘട്ടത്തിൽ മാത്രം തീരുന്ന ഒന്നല്ല. രണ്ട് സാഹചര്യങ്ങളിൽ സംരക്ഷണം ആവശ്യമാണ്:

  • Text nodes – ടാഗുകൾക്കിടയിലുള്ള ഉള്ളടക്കം. < എന്നത് &lt; ആയും > എന്നത് &gt; ആയും മാറ്റുന്നത് ടാഗുകളെ തടയും, എന്നാൽ ഒരു അറ്റാക്കർക്ക് ഒരു അറ്റ്രിബ്യൂട്ട് വാല്യൂവിൽ (attribute value) നിന്ന് പുറത്തുകടക്കുന്നത് തടയാൻ ഇതിനാവില്ല.
  • Attribute valueshref="…" പോലുള്ള ടാഗുകൾക്കുള്ളിലെ സ്ട്രിംഗുകൾ. ഒരു കോട്ട് (" അല്ലെങ്കിൽ ') ഇൻജക്ട് ചെയ്യുന്നതിലൂടെ അറ്റാക്കർക്ക് അറ്റ്രിബ്യൂട്ട് നേരത്തെ അവസാനിപ്പിക്കാനും സ്വന്തം മാർക്കപ്പ് (markup) ചേർക്കാനും സാധിക്കും.

യഥാർത്ഥ കോഡ് പ്ലെയിൻ ടെക്സ്റ്റ് (plain text) മാത്രമേ കൈകാര്യം ചെയ്തിരുന്നുള്ളൂ, ഇത് അറ്റ്രിബ്യൂട്ട് ഇൻജക്ഷന് (attribute injection) വലിയൊരു അവസരം നൽകി.

പ്രശ്നം പരിഹരിക്കുന്നു

ഡെവലപ്പർ ഒരു ചെറിയ escapeHtml ഹെൽപ്പർ ചേർക്കുകയും, ഒരു വാല്യൂ ടെക്സ്റ്റ് നോഡിലായാലും അറ്റ്രിബ്യൂട്ടിലായാലും അത് ഇന്റർപ്പോലേഷൻ (interpolation) ചെയ്യുന്നതിന് മുമ്പ് ഓരോ ഉപയോക്താവ് നൽകുന്ന വാല്യൂവിനും അത് പ്രയോഗിക്കുകയും ചെയ്തു.

പരിശോധനാ ഘട്ടങ്ങൾ

  • Local testing – ഇൻജക്ഷൻ സ്ട്രിംഗുകളുടെ ഒരു കൂട്ടം ടെംപ്ലേറ്റ് ഫംഗ്ഷനുകളിലേക്ക് നൽകി. ഓരോ പരിശോധനയിലും എസ്കേപ്പ് ചെയ്ത ക്യാരക്ടറുകൾ മാത്രമേ കാണിച്ചുള്ളൂ, പ്രവർത്തിപ്പിക്കാൻ കഴിയുന്ന ടാഗുകൾ ഒന്നും ഉണ്ടായിരുന്നില്ല.
  • Production testing – പാച്ച് (patch) വിന്യസിച്ചതിന് ശേഷം, ലൈവ് സൈറ്റിലൂടെ ഒരു പേലോഡ് സമർപ്പിച്ചു, ഇത് Cloudflare Turnstile ബോട്ട് ചെക്ക് വിജയകരമായി കടന്നു. resulting ഇമെയിൽ ഡെവലപ്പറുടെ ഇൻബോക്സിൽ എത്തി; മാലീഷ്യസ് ലിങ്കും സ്ക്രിപ്റ്റ് ടാഗുകളും ക്ലിക്ക് ചെയ്യാവുന്ന എലമെന്റുകൾക്ക് പകരം അർത്ഥശൂന്യമായ ടെക്സ്റ്റ് (garbled text) ആയിട്ടാണ് വന്നത്.

Gmail-നെ കുറിച്ച് ഒരു കുറിപ്പ്: ഈ സർവീസ് ഒരു URL-നെ നീല നിറത്തിൽ കാണിക്കുകയും അത് ക്ലിക്ക് ചെയ്യാവുന്നതാക്കി മാറ്റുകയും ചെയ്തേക്കാം, എന്നാൽ അത് ക്ലയന്റ് സൈഡ് സൗകര്യം മാത്രമാണ്, അതിനർത്ഥം HTML ഇൻജക്ഷൻ വിജയിച്ചു എന്നല്ല. യഥാർത്ഥ ബട്ടണുകൾ നിർമ്മിക്കുന്നതിനോ സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിപ്പിക്കുന്നതിനോ ഉള്ള ഇൻജക്ഷനെ ഈ പരിഹാരം തടയുന്നു.

ഡെവലപ്പർമാർ ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ

  • പബ്ലിക് ഫോമുകളിൽ നിന്നുള്ള ഡാറ്റ ഒരിക്കലും വിശ്വസിക്കരുത് – നിരുപദ്രവകരമെന്ന് തോന്നുന്ന ഫോമുകൾ പോലും മറ്റൊരിടത്ത് ഉപയോഗിക്കുന്ന സ്റ്റോർഡ് ഔട്ട്പുട്ട് (stored output) ഉണ്ടാക്കിയേക്കാം.
  • ഉപയോഗിക്കുന്ന സമയത്ത് എസ്കേപ്പ് ചെയ്യുക – റെൻഡറിംഗിന് (rendering) തൊട്ടുമുമ്പ് മാത്രം കോൺടെക്സ്റ്റ് അറിഞ്ഞുള്ള എസ്കേപ്പിംഗ് (text vs. attribute) പ്രയോഗിക്കുക, പൈപ്പ്‌ലൈനിന്റെ തുടക്കത്തിൽ തന്നെ ചെയ്യരുത്.
  • ക്ലയന്റ് സൈഡും സെർവർ സൈഡും പരിശോധിക്കുക – യൂണിറ്റ് ടെസ്റ്റുകൾ (Unit tests) വ്യക്തമായ പരാജയങ്ങൾ കണ്ടെത്താൻ സഹായിക്കും; ലൈവ് UI-ലൂടെയുള്ള ഒരു മാനുവൽ എൻഡ്-ടു-എൻഡ് ടെസ്റ്റ് യഥാർത്ഥ ട്രാഫിക്കിൽ പ്രതിരോധം നിലനിൽക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുന്നു.
  • ഇമെയിൽ ക്ലയന്റുകളുടെ പ്രത്യേകതകൾ ശ്രദ്ധിക്കുക – ചില ക്ലയന്റുകൾ URL-കൾ ഓട്ടോമാറ്റിക്കായി ലിങ്ക് ചെയ്യും, ഇത് സുരക്ഷയെക്കുറിച്ച് തെറ്റായ ധാരണ നൽകിയേക്കാം. അടിസ്ഥാനപരമായ HTML-ൽ ആക്റ്റീവ് എലമെന്റുകൾ ഇല്ലെന്ന് ഉറപ്പുവരുത്തുക.

ചുരുക്കത്തിൽ

ഉപയോക്താവിന്റെ ഇൻപുട്ട് കൈകാര്യം ചെയ്യുന്നതിലെ ഒരു ചെറിയ അശ്രദ്ധ സാധാരണ നോട്ടിഫിക്കേഷൻ ഇമെയിലുകളെ ഒരു ഫിഷിംഗ് വെക്ടറായി (phishing vector) മാറ്റി. സമഗ്രമായ ഒരു HTML-escaping രീതി നടപ്പിലാക്കിയതും ലോക്കലായും പ്രൊഡക്ഷനിലും അത് പരിശോധിച്ചതും ഇൻബോക്സിന്റെ സുരക്ഷിതത്വം വീണ്ടെടുത്തു. വിശ്വസിക്കാൻ കഴിയാത്ത ഡാറ്റയിൽ നിന്ന് HTML നിർമ്മിക്കുന്ന ഏതൊരു വെബ് ആപ്പിനും ഈ സംഭവം ഒരു പാഠമാണ്: ശരിയായ സാനിറ്റൈസേഷൻ (sanitisation) ഒഴിവാക്കാനാവാത്ത ഒന്നാണ്, അത് അവഗണിക്കുന്നത് നിങ്ങളുടെ ഉപയോക്താക്കളുടെ ഇൻബോക്സിലേക്ക് നേരിട്ടുള്ള ഒരു വഴി തുറന്നു നൽകിയേക്കാം.