flawopen.com/command-injection/Swift
Learn how to fix Command Injection (CWE-78) in Swift. Side-by-side vulnerable vs secure code examples for Foundation Process() with argument arrays.
Stellen Sie sich vor, Sie bitten einen Assistenten, ein Dokument namens 'bericht.pdf' zu drucken. Eine Befehlsinjektion geschieht, wenn jemand den Dateinamen 'bericht.pdf; whoami' übergibt und der Assistent diesen ganzen Zettel an das Terminal weitergibt, wodurch der Bericht gedruckt und der Administratorenausweis ausgelesen wird.
Web Application SecurityCWE-918 betroffen ist.CWE-918Defense-in-DepthDie Anwendung akzeptiert Hostnamen, Dateinamen oder Diagnoseparameter direkt aus einer HTTP-Anfrage.
Das Backend erstellt den Shell-Befehlsstring durch einfache Zeichenfolgenverkettung statt über ein isoliertes Argumenten-Array.
Der Angreifer fügt Shell-Metazeichen wie ';', '&&', '|' oder Backticks ein (z. B. '127.0.0.1; id'), um den Befehlskontext zu verlassen.
Die Shell des Betriebssystems führt den angehängten Schadcode mit den Rechten des Webserverprozesses aus.
// Calling /bin/sh with string interpolation
import Foundation
func ping(host: String) {
// Attacker input: "127.0.0.1; whoami"
let process = Process()
process.executableURL = URL(fileURLWithPath: "/bin/sh")
process.arguments = ["-c", "ping -c 1 \(host)"]
try? process.run()
}
// Calling binary directly with isolated arguments array
import Foundation
func ping(host: String) {
let process = Process()
process.executableURL = URL(fileURLWithPath: "/sbin/ping")
// host is strictly an argument, never parsed as a shell command
process.arguments = ["-c", "1", host]
try? process.run()
}
system() function in Swift.