ఒక React బండిల్లో API Key: 33 రోజుల పాటు ప్రమాదంలో
నేను ఒక పబ్లిక్ React బండిల్లో 33 రోజుల పాటు API కీని వదిలేశాను.
ఆమ్స్టర్డామ్లోని ఒక VPS నా Brevo కీని ఉపయోగించింది. Brevo ఆ మోసాన్ని గుర్తించి, ఎటువంటి నష్టం జరగకముందే దానిని రద్దు చేసింది. నేను అదృష్టవంతుడిని. చాలా మందికి అలా జరగదు.
ఇది ఎలా జరిగింది మరియు నేను ఏమి నేర్చుకున్నానో ఇక్కడ ఉంది.
పొరపాటు
నేను ఒక చిన్న టూల్ను తయారు చేస్తున్నాను. నా ఇతర ప్రాజెక్ట్లు ఫ్రంటెండ్ నుండి నేరుగా Brevo APIని పిలుస్తున్నాయని నేను గమనించాను. అక్కడ అది పని చేసింది, కాబట్టి ఈ కొత్త ప్రాజెక్ట్ కోసం కూడా నేను అదే చేశాను.
నేను ఒక విషయాన్ని గమనించలేదు. నా ఇతర ప్రాజెక్ట్లు పబ్లిక్ ప్రొడక్షన్ బండిల్లను పంపవు. కానీ ఇది పంపింది.
Vite నా API కీని JavaScript ఫైల్లోకి ఇన్లైన్ (inline) చేసింది. సైట్ను సందర్శించే ఎవరైనా Ctrl+U నొక్కి నా సీక్రెట్ కీని చూడవచ్చు. GitHub రిపోజిటరీ ప్రైవేట్గా ఉంది, కానీ బండిల్ డిజైన్ పరంగా పబ్లిక్గా ఉంటుంది. బ్రౌజర్లు అలానే పనిచేస్తాయి.
తప్పుడు భద్రతా భావం
కీని మార్చడం (rotating) ద్వారా అంతా సరిపోతుందని నేను అనుకున్నాను. కానీ అది జరగలేదు. నేను రెండు ప్రధాన చిక్కుల్లో పడ్డాను:
Cloudflare Pages: నేను డ్యాష్బోర్డ్లో సీక్రెట్ను అప్డేట్ చేశాను. కానీ సైట్ ఇంకా పాత కీనే ఉపయోగిస్తోంది. Cloudflare సీక్రెట్లను డిప్లాయ్ సమయంలో (deploy time) బైండ్ చేస్తుంది, రిక్వెస్ట్ సమయంలో కాదు. మార్పులు అమలు కావాలంటే మీరు మళ్ళీ రీడిప్లాయ్ (redeploy) చేయాలి.
Azure App Service (.NET): నేను Application Settings అప్డేట్ చేశాను. కానీ రన్ అవుతున్న ప్రాసెస్ పాత కీనే వాడుతూ ఉంది. నేను కీని ఒక singleton HttpClientలోకి ఇంజెక్ట్ చేయడం వల్ల ఇది జరిగింది. యాప్ కొత్త విలువను ఎప్పుడూ చదవలేదు. నేను మాన్యువల్గా App Serviceని రీస్టార్ట్ చేయాల్సి వచ్చింది.
దాడి చేసే వ్యూహం
దాడి చేసే వ్యక్తి కేవలం కీని మాత్రమే ఉపయోగించలేదు. వారు Brevo యొక్క auto-allowlist ఫీచర్ను ఉపయోగించారు. వారు కొన్ని వారాల పాటు నా ట్రస్టెడ్ లిస్ట్లోకి వారి స్వంత IPలను జోడించారు. వారు తర్వాత నిశ్శబ్దంగా వ్యవహరించడానికి నమ్మకాన్ని (trust) పెంచుకుంటున్నారు.
నేను నేర్చుకున్న పాఠాలు
ఫ్రంటెండ్ బండిల్లో ఎప్పుడూ API కీని ఉంచకండి. మీ రిక్వెస్ట్లను ప్రాక్సీ (proxy) చేయడానికి ఎల్లప్పుడూ బ్యాకెండ్ ఫంక్షన్ను ఉపయోగించండి. ఫ్రంటెండ్ ఎప్పుడూ సీక్రెట్ను చూడకూడదు.
సెగ్మెంటేషన్ (segmentation) ఉపయోగించండి. అన్నింటికీ ఒకే కీని ఉపయోగించకండి. ఇప్పుడు నేను ప్రతి డిప్లాయ్మెంట్ టార్గెట్కు ఒక ప్రత్యేకమైన కీని ఉపయోగిస్తున్నాను. ఒకవేళ ఒకటి లీక్ అయినా, మిగిలినవి సురక్షితంగా ఉంటాయి.
సర్వర్లెస్ ఎన్విరాన్మెంట్లలో (serverless environments) auto-allowlists పై ఆధారపడకండి. అవి ఊహించని విధంగా ఉంటాయి.
ఒక రోటేషన్ ప్లేబుక్ (rotation playbook) సిద్ధం చేసుకోండి. కీని అప్డేట్ చేయడం అనేది ఒకే ఒక నమ్మకమైన ప్రక్రియగా ఉండాలి, వేర్వేరు ప్లాట్ఫారమ్లలో వరుస మాన్యువల్ దశలుగా ఉండకూడదు.
భద్రతా పనులు (Security work) అవి అత్యవసరమయ్యే వరకు పనికిరానివిగా అనిపిస్తాయి. మీకు అవసరమయ్యే ముందే మీ రోటేషన్ దశలను సిద్ధం చేసుకోండి.
Source: https://dev.to/lainagent_ai/an-api-key-in-a-react-bundle-33-days-to-compromise-2mi6
ఐచ్ఛిక అభ్యాస సమూహం: https://t.me/GyaanSetuAi