gh-87451: Apply CVE-2021-4189 PASV fix to ftplib.ftpcp() by gpshead · Pull Request #149648 · python/cpython

gpshead · GitHub

ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding (AKA ikow) for the report.

Closed

picnixz
picnixz

…pcp test Replace the _Fake* helper classes in TestFtpcpSecurity with mock.Mock objects spec'd against ftplib.FTP. The spec gives a real-API check that ftpcp() only touches attributes that exist on FTP, and a keyword-only _make_pair() helper keeps the call sites self-documenting.

gpshead

added a commit that referenced this pull request

May 13, 2026

…49648

) (

#149794

)

gh-87451

: Apply

CVE-2021-4189

PASV fix to ftplib.ftpcp() (

GH-149648

) ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding at Aurascape AI for the report. (GHSA-w8c5-q2xf-gf7c) (cherry picked from commit

eac4fe3

) Co-authored-by: Gregory P. Smith <[email protected]>

gpshead

added a commit that referenced this pull request

May 13, 2026

…49648

) (

#149793

)

gh-87451

: Apply

CVE-2021-4189

PASV fix to ftplib.ftpcp() (

GH-149648

) ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding at Aurascape AI for the report. (GHSA-w8c5-q2xf-gf7c) (cherry picked from commit

eac4fe3

) Co-authored-by: Gregory P. Smith <[email protected]>

gpshead

added a commit that referenced this pull request

May 15, 2026

…49648

) (

#149792

)

gh-87451

: Apply

CVE-2021-4189

PASV fix to ftplib.ftpcp() (

GH-149648

) ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding at Aurascape AI for the report. (GHSA-w8c5-q2xf-gf7c) (cherry picked from commit

eac4fe3

) Co-authored-by: Gregory P. Smith <[email protected]>

Yhg1s

pushed a commit that referenced this pull request

May 18, 2026

…49648

) (

#149795

)

gh-87451

: Apply

CVE-2021-4189

PASV fix to ftplib.ftpcp() (

GH-149648

) ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding at Aurascape AI for the report. (GHSA-w8c5-q2xf-gf7c) (cherry picked from commit

eac4fe3

) Co-authored-by: Gregory P. Smith <[email protected]>

pablogsal

pushed a commit that referenced this pull request

Jun 27, 2026

…49648

) (

#149796

)

gh-87451

: Apply

CVE-2021-4189

PASV fix to ftplib.ftpcp() (

GH-149648

) ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding at Aurascape AI for the report. (GHSA-w8c5-q2xf-gf7c) (cherry picked from commit

eac4fe3

) Co-authored-by: Gregory P. Smith <[email protected]>

pablogsal

pushed a commit that referenced this pull request

Jun 27, 2026

…49648

) (

#149797

)

gh-87451

: Apply

CVE-2021-4189

PASV fix to ftplib.ftpcp() (

GH-149648

) ftpcp() called parse227() directly and passed the source server's self-reported PASV IPv4 address to the target server's PORT command, bypassing the

CVE-2021-4189

fix that was applied only to FTP.makepasv(). A malicious source FTP server could use this to redirect the target server's data connection to an arbitrary host:port (SSRF). ftpcp() now uses the source server's actual peer address, honoring the existing trust_server_pasv_ipv4_address opt-out, the same as makepasv(). Thanks to Qi Ding at Aurascape AI for the report. (GHSA-w8c5-q2xf-gf7c) (cherry picked from commit

eac4fe3

) Co-authored-by: Gregory P. Smith <[email protected]>