Lack of data validation - Path Traversal In basic-ftp
Description
Basic FTP has Path Traversal Vulnerability in its downloadToDir() method
The basic-ftp library contains a path traversal vulnerability in the downloadToDir() method. A malicious FTP server can send directory listings with filenames containing path traversal sequences (../) that cause files to be written outside the intended download directory.
Source-to-Sink Flow
1. SOURCE: FTP server sends LIST response └─> "-rw-r--r-- 1 user group 1024 Jan 20 12:00 ../../../etc/passwd" 2. PARSER: parseListUnix.ts:100 extracts filename └─> file.name = "../../../etc/passwd" 3. VALIDATION: parseListUnix.ts:101 checks └─> if (name === "." || name === "..") ❌ (only filters exact matches)...
Vulnerable Code
File: src/Client.ts:707
protected async _downloadFromWorkingDir(localDirPath: string): Promise<void> { await ensureLocalDirectory(localDirPath) for (const file of await this.list()) { const localPath = join(localDirPath, file.name) // ⚠️ VULNERABLE // file.name comes from untrusted FTP server, no sanitization await this.downloadTo(localPath, file.name) } }...
Root Cause:
- Parser validation (parseListUnix.ts:101) only filters exact . or .. entries
- No sanitization of ../ sequences in filenames
path.join() doesn't prevent traversal, fs.open() resolves paths
Impact
A malicious FTP server can: - Write files to arbitrary locations on the client filesystem - Overwrite critical system files (if user has write access) - Potentially achieve remote code execution
Affected Versions
Tested: v5.1.0
Likely: All versions (code pattern exists since initial implementation)
Mitigation
Workaround: Do not use downloadToDir() with untrusted FTP servers.
Fix: Sanitize filenames before use:
import { basename } from 'path' // In _downloadFromWorkingDir: const sanitizedName = basename(file.name) // Strip path components const localPath = join(localDirPath, sanitizedName)
Update Impact
Minimal update. May introduce new vulnerabilities or breaking changes.
Ecosystem | Package | Affected version | Patched versions |
|---|---|---|---|
npm | 5.2.0 | ||
debian 13 | 0~2024040606-6+deb13u1 | ||
debian 14 | 0~2025070717+~cs15.2.7-1 |
Aliases
References