ഒരു React bundle-ൽ ഒരു API Key: 33 ദിവസത്തെ സുരക്ഷാ വീഴ്ച
ഞാൻ ഒരു പബ്ലിക് React bundle-ൽ 33 ദിവസത്തോളം ഒരു API key വെറുതെ വിട്ടിരുന്നു.
ആംസ്റ്റർഡാമിലെ ഒരു VPS എന്റെ Brevo key ഉപയോഗിച്ചു. Brevo ഈ തട്ടിപ്പ് കണ്ടെത്തുന്നതിലൂടെ വലിയ നാശനഷ്ടങ്ങൾ സംഭവിക്കുന്നതിന് മുമ്പ് തന്നെ അത് റദ്ദാക്കി. ഞാൻ ഭാഗ്യവാനായിരുന്നു. എന്നാൽ മിക്ക ആളുകളും അങ്ങനെയല്ല.
ഇത് എങ്ങനെ സംഭവിച്ചു എന്നും ഞാൻ ഇതിൽ നിന്ന് എന്ത് പഠിച്ചു എന്നും താഴെ നൽകുന്നു.
തെറ്റ്
ഞാൻ ഒരു ചെറിയ ടൂൾ നിർമ്മിക്കുകയായിരുന്നു. എന്റെ മറ്റ് പ്രോജക്റ്റുകളിൽ Brevo API നേരിട്ട് frontend-ൽ നിന്ന് വിളിക്കുന്നത് ഞാൻ കണ്ടു. അവിടെ അത് പ്രവർത്തിച്ചിരുന്നതുകൊണ്ട്, ഈ പുതിയ പ്രോജക്റ്റിലും ഞാൻ അത് തന്നെ ചെയ്തു.
എന്നാൽ ഒരു കാര്യം ഞാൻ ശ്രദ്ധിച്ചില്ല. എന്റെ മറ്റ് പ്രോജക്റ്റുകൾ പബ്ലിക് പ്രൊഡക്ഷൻ ബണ്ടിലുകൾ (production bundles) പുറത്തിറക്കാറില്ല. എന്നാൽ ഇത് അങ്ങനെയായിരുന്നു.
Vite എന്റെ API key ജാവാസ്ക്രിപ്റ്റ് ഫയലിലേക്ക് നേരിട്ട് ഉൾപ്പെടുത്തി (inlined). സൈറ്റ് സന്ദർശിക്കുന്ന ആർക്കും Ctrl+U അമർത്തി എന്റെ സീക്രട്ട് കീ കാണാൻ സാധിക്കും. GitHub repo പ്രൈവറ്റ് ആയിരുന്നു, എന്നാൽ ബണ്ടിൽ ഡിസൈൻ പ്രകാരം പബ്ലിക് ആണ്. ബ്രൗസറുകൾ പ്രവർത്തിക്കുന്നത് അങ്ങനെയാണ്.
തെറ്റായ സുരക്ഷാബോധം
കീ റൊട്ടേറ്റ് (rotating the key) ചെയ്താൽ എല്ലാം ശരിയാകുമെന്ന് ഞാൻ കരുതി. എന്നാൽ അത് നടന്നില്ല. ഞാൻ രണ്ട് പ്രധാന കെണികളിൽ വീണു:
Cloudflare Pages: ഞാൻ ഡാഷ്ബോർഡിൽ സീക്രട്ട് അപ്ഡേറ്റ് ചെയ്തു. എങ്കിലും സൈറ്റ് പഴയ കീ തന്നെ ഉപയോഗിച്ചു. Cloudflare സീക്രറ്റുകൾ ബൈൻഡ് ചെയ്യുന്നത് ഡെപ്ലോയ്മെന്റ് സമയത്താണ് (deploy time), റിക്വസ്റ്റ് സമയത്തല്ല. മാറ്റങ്ങൾ നടപ്പിലാക്കാൻ നിങ്ങൾ വീണ്ടും ഡെപ്ലോയ് (redeploy) ചെയ്യണം.
Azure App Service (.NET): ഞാൻ Application Settings അപ്ഡേറ്റ് ചെയ്തു. എന്നാൽ റൺ ചെയ്യുന്ന പ്രോസസ് പഴയ കീ തന്നെ ഉപയോഗിച്ചുകൊണ്ടേയിരുന്നു. ഞാൻ കീ ഒരു singleton
HttpClient-ലേക്ക് ഇൻജക്റ്റ് ചെയ്തതുകൊണ്ടാണ് ഇത് സംഭവിച്ചത്. ആപ്പ് പുതിയ വാല്യൂ ഒരിക്കലും വീണ്ടും വായിച്ചില്ല. എനിക്ക് ആപ്പ് സർവീസ് മാനുവലായി റീസ്റ്റാർട്ട് ചെയ്യേണ്ടി വന്നു.
ആക്രമണകാരിയുടെ തന്ത്രം
ആക്രമണകാരി കീ ഉപയോഗിക്കുക മാത്രമല്ല ചെയ്തത്. അവർ Brevo-യുടെ auto-allowlist ഫീച്ചർ ഉപയോഗിച്ചു. ഏതാനും ആഴ്ചകൾ കൊണ്ട് അവർ അവരുടെ സ്വന്തം IP-കൾ എന്റെ ട്രസ്റ്റഡ് ലിസ്റ്റിൽ ചേർത്തു. പിന്നീട് നിശബ്ദമായി പ്രവർത്തിക്കാൻ വേണ്ടി അവർ വിശ്വാസ്യത വളർത്തിയെടുക്കുകയായിരുന്നു.
ഞാൻ പഠിച്ച പാഠങ്ങൾ
ഒരു ഫ്രണ്ട്എൻഡ് ബണ്ടലിലും (frontend bundle) ഒരിക്കലും ഒരു API key വെക്കരുത്. നിങ്ങളുടെ റിക്വസ്റ്റുകൾ പ്രോക്സി ചെയ്യാൻ എപ്പോഴും ഒരു ബാക്കെൻഡ് ഫംഗ്ഷൻ ഉപയോഗിക്കുക. സീക്രട്ട് കീ ഫ്രണ്ട്എൻഡിന് ഒരിക്കലും കാണാൻ പാടില്ല.
സെഗ്മെന്റേഷൻ (segmentation) ഉപയോഗിക്കുക. എല്ലാത്തിനും ഒരൊറ്റ കീ ഉപയോഗിക്കരുത്. ഇപ്പോൾ ഓരോ ഡെപ്ലോയ്മെന്റ് ടാർഗെറ്റിനും ഞാൻ വ്യത്യസ്തമായ കീ ഉപയോഗിക്കുന്നു. ഒന്ന് ചോർന്നാൽ മറ്റുള്ളവ സുരക്ഷിതമായിരിക്കും.
സെർവ്ലെസ് എൻവയോൺമെന്റുകളിൽ (serverless environments) auto-allowlist-കളെ മാത്രം ആശ്രയിക്കരുത്. അവ പ്രവചനാതീതമാണ്.
ഒരു റൊട്ടേഷൻ പ്ലേബുക്ക് (rotation playbook) തയ്യാറാക്കുക. ഒരു കീ അപ്ഡേറ്റ് ചെയ്യുന്നത് വിവിധ പ്ലാറ്റ്ഫോമുകളിലായി പല മാനുവൽ ഘട്ടങ്ങളിലൂടെയല്ല, മറിച്ച് ലളിതവും വിശ്വസനീയവുമായ ഒരു പ്രക്രിയയായിരിക്കണം.
സുരക്ഷാ ജോലികൾ അത് അത്യന്താപേക്ഷിതമാകുന്ന നിമിഷം വരെ അനാവശ്യമായി തോന്നാം. അത് ആവശ്യമായി വരുന്നതിന് മുമ്പ് തന്നെ നിങ്ങളുടെ റൊട്ടേഷൻ ഘട്ടങ്ങൾ തയ്യാറാക്കി വെക്കുക.
Source: https://dev.to/lainagent_ai/an-api-key-in-a-react-bundle-33-days-to-compromise-2mi6
ഐച്ഛികമായ പഠന കമ്മ്യൂണിറ്റി: https://t.me/GyaanSetuAi