Compare commits

...

3 Commits

Author SHA1 Message Date
Pаramtamtām
da085cab0d
Merge ccdecfd832 into 932c4e3fd9 2026-08-07 16:57:22 +03:00
Vladimir Dubrovin
932c4e3fd9 Fix use-after-free on ftp:// request path in proxychild()
ss pointed into the buf request buffer and was never updated when buf
was realloc()ed while reading request headers (both in the header loop
and in handlehdrfilterscli()). The ftp:// branch then dereferenced the
stale pointer.

Store ss as an offset into buf and recompute it before use.

Requires authenticated access to proxy or configuration with
authentication disabled.

Reported by Calif.io in collaboration with Anthropic
(ref ANT-2026-FHVKZ7VQ).
2026-08-07 16:36:51 +03:00
Pаramtamtām
ccdecfd832
Update README with alternative Docker image information
Added a tip about an alternative Docker image with Helm chart support.
2026-06-02 18:32:47 +04:00
2 changed files with 6 additions and 0 deletions

View File

@ -18,6 +18,9 @@ https://github.com/3proxy/3proxy/releases
https://hub.docker.com/r/3proxy/3proxy https://hub.docker.com/r/3proxy/3proxy
https://github.com/3proxy/3proxy/pkgs/container/3proxy https://github.com/3proxy/3proxy/pkgs/container/3proxy
> [!TIP]
> An alternative Docker image (community-maintained) with support for configuration through environment variables and a ready-to-use Helm chart for Kubernetes can be found here: [tarampampam/3proxy-docker](https://github.com/tarampampam/3proxy-docker).
### Archive of old versions ### Archive of old versions
https://github.com/z3APA3A/3proxy-archive https://github.com/z3APA3A/3proxy-archive

View File

@ -247,6 +247,7 @@ void * proxychild(struct clientparam* param) {
int redirect = 0; int redirect = 0;
int prefix = 0, ckeepalive=0; int prefix = 0, ckeepalive=0;
int ftp = 0; int ftp = 0;
int ssoff = 0;
#ifndef ANONYMOUS #ifndef ANONYMOUS
int anonymous; int anonymous;
#endif #endif
@ -338,6 +339,7 @@ for(;;){
if ((sb=(unsigned char *)(unsigned char *)strchr((char *)buf, ' ')) == NULL) {RETURN(512);} if ((sb=(unsigned char *)(unsigned char *)strchr((char *)buf, ' ')) == NULL) {RETURN(512);}
ss = ++sb; ss = ++sb;
ssoff = (int)(ss - buf);
if(!isconnect) { if(!isconnect) {
if (!strncasecmp((char *)sb, "http://", 7)) { if (!strncasecmp((char *)sb, "http://", 7)) {
sb += 7; sb += 7;
@ -640,6 +642,7 @@ for(;;){
ckeepalive = 1; ckeepalive = 1;
if(ftpbase) free(ftpbase); if(ftpbase) free(ftpbase);
ftpbase = NULL; ftpbase = NULL;
ss = buf + ssoff;
if(!(sp = (unsigned char *)strchr((char *)ss, ' '))){RETURN(799);} if(!(sp = (unsigned char *)strchr((char *)ss, ' '))){RETURN(799);}
*sp = 0; *sp = 0;