iremove securepath, simply reject relative paths: .., check / prefix - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 4028ae9814ff6ca97632004c67557e04ce639df3 /scm/geomyidae/commit/4028ae9814ff6ca97632004c67557e04ce639df3.gph bitreich.org 70 1parent 3ed956cf71a15015b443dd7ab36299c242acd1af /scm/geomyidae/commit/3ed956cf71a15015b443dd7ab36299c242acd1af.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Fri, 30 Jun 2017 15:12:40 +0200 Err bitreich.org 70 i Err bitreich.org 70 iremove securepath, simply reject relative paths: .., check / prefix Err bitreich.org 70 i Err bitreich.org 70 iwe could escape the path if for example the base dir was "base" and a Err bitreich.org 70 isecret directory starts with a name: "base.secret". The request Err bitreich.org 70 i".secret/secretfile" would translate to "base.secret/secretfile". Err bitreich.org 70 i Err bitreich.org 70 ireject relative paths: securepath() currently converts paths from Err bitreich.org 70 i"/../file" to "/.//file" which won't work, so remove it. Err bitreich.org 70 i Err bitreich.org 70 ialways check if a path starts with "/" or is empty. Err bitreich.org 70 i Err bitreich.org 70 iSigned-off-by: Christoph Lohmann <20h@r-36.net> Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 27 +++------------------------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 3 insertions(+), 24 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -82,28 +82,6 @@ dropprivileges(struct group *gr, struct passwd *pw) Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-char * Err bitreich.org 70 i-securepath(char *p, int len) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int i; Err bitreich.org 70 i- Err bitreich.org 70 i- if(len < 2) Err bitreich.org 70 i- return p; Err bitreich.org 70 i- Err bitreich.org 70 i- for(i = 1; i < strlen(p); i++) { Err bitreich.org 70 i- if(p[i - 1] == '.' && p[i] == '.') { Err bitreich.org 70 i- if(p[i - 2] == '/') Err bitreich.org 70 i- p[i] = '/'; Err bitreich.org 70 i- if(p[i + 1] == '/') Err bitreich.org 70 i- p[i] = '/'; Err bitreich.org 70 i- if(len == 2) Err bitreich.org 70 i- p[i] = '/'; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- return p; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i void Err bitreich.org 70 i logentry(char *host, char *port, char *qry, char *status) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -171,11 +149,12 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i if(args != nil) Err bitreich.org 70 i *args++ = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i- securepath(recvb, len - 2); Err bitreich.org 70 i- if(strlen(recvb) == 0) { Err bitreich.org 70 i+ if(recvb[0] == '\0') { Err bitreich.org 70 i recvb[0] = '/'; Err bitreich.org 70 i recvb[1] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i+ if(recvb[0] != '/' || strstr(recvb, "..")) Err bitreich.org 70 i+ return; Err bitreich.org 70 i Err bitreich.org 70 i snprintf(path, sizeof(path), "%s%s", base, recvb); Err bitreich.org 70 i Err bitreich.org 70 .