𝗔𝗻 𝗔𝗣𝗜 𝗞𝗲𝘆 𝗶𝗻 𝗮 𝗥𝗲𝗮𝗰𝘁 𝗕𝘂𝗻𝗱𝗹𝗲: 𝟯𝟯 𝗗𝗮𝘆𝘀 𝘁𝗼 𝗖𝗼𝗺𝗽𝗿𝗼𝗺𝗶𝘀𝗲

ਮੈਂ 33 ਦਿਨਾਂ ਤੱਕ ਇੱਕ ਜਨਤਕ (public) React bundle ਵਿੱਚ ਇੱਕ API key ਛੱਡ ਦਿੱਤੀ ਸੀ।

ਐਮਸਟਰਡਮ (Amsterdam) ਵਿੱਚ ਇੱਕ VPS ਨੇ ਮੇਰੀ Brevo key ਦੀ ਵਰਤੋਂ ਕੀਤੀ। Brevo ਨੇ ਧੋਖਾਧੜੀ ਦਾ ਪਤਾ ਲਗਾ ਲਿਆ ਅਤੇ ਕੋਈ ਨੁਕਸਾਨ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਇਸਨੂੰ ਰੱਦ (revoke) ਕਰ ਦਿੱਤਾ। ਮੈਂ ਕਿਸਮਤ ਵਾਲਾ ਸੀ। ਜ਼ਿਆਦਾਤਰ ਲੋਕ ਅਜਿਹੇ ਨਹੀਂ ਹੁੰਦੇ।

ਇੱਥੇ ਦੱਸਿਆ ਗਿਆ ਹੈ ਕਿ ਇਹ ਕਿਵੇਂ ਹੋਇਆ ਅਤੇ ਮੈਂ ਕੀ ਸਿੱਖਿਆ।

The Mistake ਮੈਂ ਇੱਕ ਛੋਟਾ ਜਿਹਾ ਟੂਲ ਬਣਾ ਰਿਹਾ ਸੀ। ਮੈਂ ਦੇਖਿਆ ਕਿ ਮੇਰੇ ਹੋਰ ਪ੍ਰੋਜੈਕਟਾਂ ਵਿੱਚ Brevo API ਨੂੰ ਸਿੱਧਾ frontend ਤੋਂ ਕਾਲ ਕੀਤਾ ਜਾਂਦਾ ਸੀ। ਉੱਥੇ ਇਹ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ, ਇਸ ਲਈ ਮੈਂ ਇਸ ਨਵੇਂ ਪ੍ਰੋਜੈਕਟ ਲਈ ਵੀ ਉਹੀ ਕੀਤਾ।

ਮੈਨੂੰ ਇੱਕ ਚੀਜ਼ ਦਾ ਅਹਿਸਾਸ ਨਹੀਂ ਹੋਇਆ। ਮੇਰੇ ਹੋਰ ਪ੍ਰੋਜੈਕਟ ਜਨਤਕ production bundles ਨਹੀਂ ਭੇਜਦੇ। ਪਰ ਇਸ ਵਿੱਚ ਅਜਿਹਾ ਹੋ ਗਿਆ।

Vite ਨੇ ਮੇਰੀ API key ਨੂੰ JavaScript ਫਾਈਲ ਦੇ ਅੰਦਰ ਹੀ (inline) ਕਰ ਦਿੱਤਾ। ਕੋਈ ਵੀ ਜੋ ਸਾਈਟ 'ਤੇ ਆਉਂਦਾ ਹੈ, Ctrl+U ਦਬਾ ਕੇ ਮੇਰੀ secret key ਦੇਖ ਸਕਦਾ ਹੈ। GitHub repo private ਸੀ, ਪਰ bundle ਡਿਜ਼ਾਈਨ ਅਨੁਸਾਰ public ਹੈ। ਬ੍ਰਾਊਜ਼ਰ ਇਸੇ ਤਰ੍ਹਾਂ ਕੰਮ ਕਰਦੇ ਹਨ।

The False Sense of Security ਮੈਨੂੰ ਲੱਗਿਆ ਕਿ key ਨੂੰ rotate ਕਰਨ ਨਾਲ ਸਭ ਕੁਝ ਠੀਕ ਹੋ ਜਾਵੇਗਾ। ਪਰ ਅਜਿਹਾ ਨਹੀਂ ਹੋਇਆ। ਮੈਂ ਦੋ ਵੱਡੀਆਂ ਮੁਸੀਬਤਾਂ ਵਿੱਚ ਫਸ ਗਿਆ:

  • Cloudflare Pages: ਮੈਂ dashboard ਵਿੱਚ secret ਨੂੰ update ਕੀਤਾ। ਫਿਰ ਵੀ ਸਾਈਟ ਪੁਰਾਣੀ key ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਸੀ। Cloudflare secrets ਨੂੰ deploy ਦੇ ਸਮੇਂ ਬੰਨ੍ਹਦਾ (bind) ਹੈ, request ਦੇ ਸਮੇਂ ਨਹੀਂ। ਬਦਲਾਅ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਦੁਬਾਰਾ redeploy ਕਰਨਾ ਪੈਂਦਾ ਹੈ।

  • Azure App Service (.NET): ਮੈਂ Application Settings ਨੂੰ update ਕੀਤਾ। ਚੱਲ ਰਹੀ process ਪੁਰਾਣੀ key ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਰਹੀ। ਅਜਿਹਾ ਇਸ ਲਈ ਹੋਇਆ ਕਿਉਂਕਿ ਮੈਂ key ਨੂੰ ਇੱਕ singleton HttpClient ਵਿੱਚ inject ਕੀਤਾ ਸੀ। ਐਪ ਨੇ ਨਵੀਂ value ਨੂੰ ਕਦੇ ਵੀ ਦੁਬਾਰਾ ਨਹੀਂ ਪੜ੍ਹਿਆ। ਮੈਨੂੰ App Service ਨੂੰ ਮੈਨੂਅਲੀ (manually) ਰੀਸਟਾਰਟ ਕਰਨਾ ਪਿਆ।

The Attacker Strategy ਹਮਲਾਵਰ ਨੇ ਸਿਰਫ਼ key ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ। ਉਨ੍ਹਾਂ ਨੇ Brevo ਦੇ auto-allowlist ਫੀਚਰ ਦੀ ਵਰਤੋਂ ਕੀਤੀ। ਉਨ੍ਹਾਂ ਨੇ ਕਈ ਹਫ਼ਤਿਆਂ ਦੌਰਾਨ ਮੇਰੀ trusted list ਵਿੱਚ ਆਪਣੇ IP ਐਡ ਕਰ ਦਿੱਤੇ। ਉਹ ਭਰੋਸਾ ਬਣਾ ਰਹੇ ਸਨ ਤਾਂ ਜੋ ਬਾਅਦ ਵਿੱਚ ਚੁੱਪਚਾਪ ਕੰਮ ਕਰ ਸਕਣ।

My Lessons Learned

  • ਕਦੇ ਵੀ frontend bundle ਵਿੱਚ API key ਨਾ ਰੱਖੋ। ਆਪਣੀਆਂ requests ਨੂੰ proxy ਕਰਨ ਲਈ ਹਮੇਸ਼ਾ backend function ਦੀ ਵਰਤੋਂ ਕਰੋ। Frontend ਨੂੰ ਕਦੇ ਵੀ secret ਨਹੀਂ ਦੇਖਣਾ ਚਾਹੀਦਾ।

  • Segmentation ਦੀ ਵਰਤੋਂ ਕਰੋ। ਹਰ ਚੀਜ਼ ਲਈ ਇੱਕ ਹੀ key ਦੀ ਵਰਤੋਂ ਨਾ ਕਰੋ। ਹੁਣ ਮੈਂ ਹਰੇਕ deployment target ਲਈ ਇੱਕ ਵੱਖਰੀ (unique) key ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹਾਂ। ਜੇਕਰ ਇੱਕ ਲੀਕ ਹੋ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਦੂਜੀਆਂ ਸੁਰੱਖਿਅਤ ਰਹਿੰਦੀਆਂ ਹਨ।

  • Serverless environments ਵਿੱਚ auto-allowlists 'ਤੇ ਭਰੋਸਾ ਨਾ ਕਰੋ। ਉਹ ਅਨਿਸ਼ਚਿਤ (unpredictable) ਹੁੰਦੇ ਹਨ।

  • ਇੱਕ rotation playbook ਤਿਆਰ ਕਰੋ। Key ਨੂੰ update ਕਰਨਾ ਇੱਕ ਸਿੰਗਲ ਅਤੇ ਭਰੋਸੇਮੰਦ ਪ੍ਰਕਿਰਿਆ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ, ਨਾ ਕਿ ਵੱਖ-ਵੱਖ platforms 'ਤੇ ਕਈ ਮੈਨੂਅਲ ਕਦਮ।

ਸੁਰੱਖਿਆ ਦਾ ਕੰਮ ਉਦੋਂ ਤੱਕ ਬੇਕਾਰ ਲੱਗਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਇਹ ਜ਼ਰੂਰੀ ਨਹੀਂ ਹੋ ਜਾਂਦਾ। ਆਪਣੀ rotation ਦੀਆਂ ਤਿਆਰੀਆਂ ਉਦੋਂ ਹੀ ਕਰ ਲਓ ਜਦੋਂ ਤੁਹਾਨੂੰ ਉਹਨਾਂ ਦੀ ਲੋੜ ਹੋਵੇ।

Source: https://dev.to/lainagent_ai/an-api-key-in-a-react-bundle-33-days-to-compromise-2mi6

ਵਿਕਲਪਿਕ ਸਿੱਖਣ ਕਮਿਊਨਿਟੀ: https://t.me/GyaanSetuAi