Skip to content

Commit edc4baa

Browse files
committed
Move contains_dot_dot() to libsudo_util.
1 parent 71fbe42 commit edc4baa

10 files changed

Lines changed: 59 additions & 58 deletions

File tree

MANIFEST

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ lib/util/closefrom.c
245245
lib/util/digest.c
246246
lib/util/digest_gcrypt.c
247247
lib/util/digest_openssl.c
248+
lib/util/dotdot.c
248249
lib/util/dup3.c
249250
lib/util/event.c
250251
lib/util/event_poll.c
@@ -305,6 +306,7 @@ lib/util/regress/corpus/seed/sudo_conf/sudo.conf.1
305306
lib/util/regress/corpus/seed/sudo_conf/sudo.conf.2
306307
lib/util/regress/corpus/seed/sudo_conf/sudo.conf.3
307308
lib/util/regress/digest/digest_test.c
309+
lib/util/regress/dotdot/dotdot_test.c
308310
lib/util/regress/fnmatch/fnm_test.c
309311
lib/util/regress/fnmatch/fnm_test.in
310312
lib/util/regress/fuzz/fuzz_sudo_conf.c
@@ -422,7 +424,6 @@ lib/zlib/zlib.h
422424
lib/zlib/zutil.c
423425
lib/zlib/zutil.h
424426
logsrvd/Makefile.in
425-
logsrvd/dotdot.c
426427
logsrvd/iolog_writer.c
427428
logsrvd/logsrv_util.c
428429
logsrvd/logsrv_util.h
@@ -440,7 +441,6 @@ logsrvd/regress/corpus/seed/logsrvd_conf/logsrvd.conf.4
440441
logsrvd/regress/corpus/seed/logsrvd_conf/logsrvd.conf.5
441442
logsrvd/regress/corpus/seed/logsrvd_conf/logsrvd.conf.6
442443
logsrvd/regress/corpus/seed/logsrvd_conf/logsrvd.conf.7
443-
logsrvd/regress/dotdot/dotdot_test.c
444444
logsrvd/regress/fuzz/fuzz_logsrvd_conf.c
445445
logsrvd/regress/fuzz/fuzz_logsrvd_conf.dict
446446
logsrvd/regress/logsrvd_conf/cacert.pem

include/sudo_util.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ sudo_dso_public size_t sudo_base64_encode_v1(const unsigned char * restrict in,
188188
sudo_dso_public char *sudo_basename_v1(const char *filename);
189189
#define sudo_basename(_a) sudo_basename_v1(_a)
190190

191+
/* dotdot.c */
192+
sudo_dso_public bool sudo_contains_dot_dot_v1(const char *str);
193+
#define sudo_contains_dot_dot(_a) sudo_contains_dot_dot_v1(_a)
194+
191195
/* gethostname.c */
192196
sudo_dso_public char *sudo_gethostname_v1(void);
193197
#define sudo_gethostname() sudo_gethostname_v1()

lib/util/Makefile.in

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ PVS_IGNORE = 'V707,V011,V002,V536,V795'
112112
PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE)
113113

114114
# Regression tests
115-
TEST_PROGS = base64_test conf_test digest_test getgids getgrouplist_test \
116-
hexchar_test hltq_test json_test multiarch_test \
115+
TEST_PROGS = base64_test conf_test digest_test dotdot_test getgids \
116+
getgrouplist_test hexchar_test hltq_test json_test multiarch_test \
117117
open_parent_dir_test parse_gids_test parseln_test progname_test \
118118
regex_test strsplit_test strtobool_test strtoid_test \
119119
strtomode_test strtonum_test uuid_test @COMPAT_TEST_PROGS@
@@ -145,14 +145,15 @@ DEVEL = @DEVEL@
145145

146146
SHELL = @SHELL@
147147

148-
LTOBJS = b64_decode.lo b64_encode.lo basename.lo @DIGEST@ event.lo fatal.lo \
149-
key_val.lo gethostname.lo gettime.lo getgrouplist.lo gidlist.lo \
150-
hexchar.lo json.lo lbuf.lo locking.lo logfac.lo login_max.lo \
151-
logpri.lo mkdir_parents.lo mmap_alloc.lo multiarch.lo parseln.lo \
152-
progname.lo rcstr.lo regex.lo roundup.lo secure_path.lo setgroups.lo \
153-
strsplit.lo strtobool.lo strtoid.lo strtomode.lo strtonum.lo \
154-
sudo_conf.lo sudo_debug.lo sudo_dso.lo term.lo ttyname_dev.lo \
155-
ttysize.lo uuid.lo @COMMON_OBJS@ @LTLIBOBJS@
148+
LTOBJS = b64_decode.lo b64_encode.lo basename.lo @DIGEST@ dotdot.lo \
149+
event.lo fatal.lo key_val.lo gethostname.lo gettime.lo \
150+
getgrouplist.lo gidlist.lo hexchar.lo json.lo lbuf.lo \
151+
locking.lo logfac.lo login_max.lo logpri.lo mkdir_parents.lo \
152+
mmap_alloc.lo multiarch.lo parseln.lo progname.lo rcstr.lo \
153+
regex.lo roundup.lo secure_path.lo setgroups.lo strsplit.lo \
154+
strtobool.lo strtoid.lo strtomode.lo strtonum.lo sudo_conf.lo \
155+
sudo_debug.lo sudo_dso.lo term.lo ttyname_dev.lo ttysize.lo \
156+
uuid.lo @COMMON_OBJS@ @LTLIBOBJS@
156157

157158
IOBJS = $(LTOBJS:.lo=.i)
158159

@@ -172,6 +173,8 @@ CONF_TEST_OBJS = conf_test.lo sudo_conf.lo
172173

173174
DIGEST_TEST_OBJS = digest_test.lo @DIGEST@
174175

176+
DOTDOT_TEST_OBJS = dotdot_test.lo dotdot.lo
177+
175178
FNM_TEST_OBJS = fnm_test.lo fnmatch.lo
176179

177180
GLOBTEST_OBJS = globtest.lo glob.lo
@@ -298,6 +301,9 @@ conf_test: $(CONF_TEST_OBJS) libsudo_util.la
298301
digest_test: $(DIGEST_TEST_OBJS) libsudo_util.la
299302
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(DIGEST_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) @LIBCRYPTO@
300303

304+
dotdot_test: $(DOTDOT_TEST_OBJS) libsudo_util.la
305+
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(DOTDOT_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS) @LIBCRYPTO@
306+
301307
fnm_test: $(FNM_TEST_OBJS) libsudo_util.la
302308
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(FNM_TEST_OBJS) libsudo_util.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
303309

@@ -468,6 +474,7 @@ check: $(TEST_PROGS) check-fuzzer
468474
./closefrom_test $(TEST_VERBOSE) || rval=`expr $$rval + $$?`; \
469475
fi; \
470476
./digest_test $(TEST_VERBOSE) || rval=`expr $$rval + $$?`; \
477+
./dotdot_test $(TEST_VERBOSE) || rval=`expr $$rval + $$?`; \
471478
if test -f fnm_test; then \
472479
./fnm_test $(TEST_VERBOSE) $(srcdir)/regress/fnmatch/fnm_test.in || rval=`expr $$rval + $$?`; \
473480
fi; \
@@ -718,6 +725,30 @@ digest_test.i: $(srcdir)/regress/digest/digest_test.c \
718725
$(CPP) $(CPPFLAGS) $(srcdir)/regress/digest/digest_test.c > $@
719726
digest_test.plog: digest_test.i
720727
rm -f $@; pvs-studio --cfg $(PVS_CFG) --source-file $(srcdir)/regress/digest/digest_test.c --i-file digest_test.i --output-file $@
728+
dotdot.lo: $(srcdir)/dotdot.c $(incdir)/compat/stdbool.h \
729+
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
730+
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(top_builddir)/config.h
731+
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/dotdot.c
732+
dotdot.i: $(srcdir)/dotdot.c $(incdir)/compat/stdbool.h \
733+
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
734+
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(top_builddir)/config.h
735+
$(CPP) $(CPPFLAGS) $(srcdir)/dotdot.c > $@
736+
dotdot.plog: dotdot.i
737+
rm -f $@; pvs-studio --cfg $(PVS_CFG) --source-file $(srcdir)/dotdot.c --i-file dotdot.i --output-file $@
738+
dotdot_test.lo: $(srcdir)/regress/dotdot/dotdot_test.c \
739+
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
740+
$(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \
741+
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
742+
$(top_builddir)/config.h
743+
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/dotdot/dotdot_test.c
744+
dotdot_test.i: $(srcdir)/regress/dotdot/dotdot_test.c \
745+
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
746+
$(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \
747+
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
748+
$(top_builddir)/config.h
749+
$(CPP) $(CPPFLAGS) $(srcdir)/regress/dotdot/dotdot_test.c > $@
750+
dotdot_test.plog: dotdot_test.i
751+
rm -f $@; pvs-studio --cfg $(PVS_CFG) --source-file $(srcdir)/regress/dotdot/dotdot_test.c --i-file dotdot_test.i --output-file $@
721752
dup3.lo: $(srcdir)/dup3.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
722753
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/dup3.c
723754
dup3.i: $(srcdir)/dup3.c $(incdir)/sudo_compat.h $(top_builddir)/config.h

logsrvd/dotdot.c renamed to lib/util/dotdot.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929

3030
#include <sudo_compat.h>
3131
#include <sudo_debug.h>
32-
#include <logsrv_util.h>
32+
#include <sudo_util.h>
3333

3434
bool
35-
contains_dot_dot(const char *str)
35+
sudo_contains_dot_dot_v1(const char *str)
3636
{
3737
const char *cp;
38-
debug_decl(contains_dot_dot, SUDO_DEBUG_UTIL);
38+
debug_decl(sudo_contains_dot_dot, SUDO_DEBUG_UTIL);
3939

4040
for (cp = str; *cp != '\0'; cp++) {
4141
/* Match ".." */
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#include <sudo_fatal.h>
3535
#include <sudo_queue.h>
3636

37-
#include <logsrv_util.h>
37+
#include <sudo_util.h>
3838

3939
sudo_dso_public int main(int argc, char *argv[]);
4040

@@ -96,7 +96,7 @@ static struct test_data test_data[] = {
9696
};
9797

9898
/*
99-
* Verify contains_dot_dot() behavior
99+
* Verify sudo_contains_dot_dot() behavior
100100
*/
101101
int
102102
main(int argc, char *argv[])
@@ -119,7 +119,7 @@ main(int argc, char *argv[])
119119
}
120120

121121
for (i = 0; test_data[i].str != NULL; i++) {
122-
bool result = contains_dot_dot(test_data[i].str);
122+
bool result = sudo_contains_dot_dot(test_data[i].str);
123123
if (result != test_data[i].expected) {
124124
sudo_warnx("test %zu:%s: expected %s, got %s", i,
125125
test_data[i].str, test_data[i].expected ? "true" : "false",

lib/util/util.exp.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ sudo_conf_plugins_v1
1919
sudo_conf_probe_interfaces_v1
2020
sudo_conf_read_v1
2121
sudo_conf_sesh_path_v1
22+
sudo_contains_dot_dot_v1
2223
sudo_debug_deregister_v1
2324
sudo_debug_enter_v1
2425
sudo_debug_execve2_v1

logsrvd/Makefile.in

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ FUZZ_MAX_LEN = 4096
116116
FUZZ_RUNS = 8192
117117
FUZZ_VERBOSE =
118118

119-
TEST_PROGS = logsrvd_conf_test dotdot_test
119+
TEST_PROGS = logsrvd_conf_test
120120
TEST_LIBS = $(LIBS)
121121
TEST_LDFLAGS = $(LDFLAGS)
122122
TEST_VERBOSE =
@@ -131,7 +131,7 @@ SHELL = @SHELL@
131131

132132
PROGS = sudo_logsrvd sudo_sendlog
133133

134-
LOGSRVD_OBJS = dotdot.o logsrv_util.o iolog_writer.o logsrvd.o logsrvd_conf.o \
134+
LOGSRVD_OBJS = logsrv_util.o iolog_writer.o logsrvd.o logsrvd_conf.o \
135135
logsrvd_journal.o logsrvd_local.o logsrvd_relay.o \
136136
logsrvd_queue.o tls_client.o tls_init.o
137137

@@ -151,8 +151,6 @@ FUZZ_LOGSRVD_CONF_CORPUS = $(srcdir)/regress/corpus/seed/logsrvd_conf/logsrvd.co
151151

152152
CONF_TEST_OBJS = logsrvd_conf_test.o logsrvd_conf.o tls_init.o
153153

154-
DOTDOT_TEST_OBJS = dotdot_test.o dotdot.o
155-
156154
all: $(PROGS)
157155

158156
depend:
@@ -189,9 +187,6 @@ fuzz_logsrvd_conf: $(FUZZ_LOGSRVD_CONF_OBJS) $(LIBFUZZSTUB) $(LT_LIBS)
189187
logsrvd_conf_test: $(CONF_TEST_OBJS) $(LT_LIBS)
190188
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CONF_TEST_OBJS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
191189

192-
dotdot_test: $(DOTDOT_TEST_OBJS) $(LT_LIBS)
193-
$(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(DOTDOT_TEST_OBJS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
194-
195190
fuzz_logsrvd_conf_seed_corpus.zip:
196191
tdir=fuzz_logsrvd_conf.$$$$; \
197192
mkdir $$tdir; \
@@ -283,7 +278,6 @@ check: $(TEST_PROGS) check-fuzzer
283278
unset LANGUAGE || LANGUAGE=; \
284279
MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \
285280
MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \
286-
./dotdot_test; \
287281
builddir=$(abs_top_builddir)/logsrvd; \
288282
cd $(srcdir) || exit 1; \
289283
if test -n "@LIBTLS@"; then \
@@ -319,32 +313,6 @@ cleandir: realclean
319313
$(FUZZ_SEED_CORPUS) run-fuzz_logsrvd_conf
320314

321315
# Autogenerated dependencies, do not modify
322-
dotdot.o: $(srcdir)/dotdot.c $(incdir)/compat/stdbool.h \
323-
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
324-
$(incdir)/sudo_queue.h $(srcdir)/logsrv_util.h \
325-
$(top_builddir)/config.h
326-
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/dotdot.c
327-
dotdot.i: $(srcdir)/dotdot.c $(incdir)/compat/stdbool.h \
328-
$(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
329-
$(incdir)/sudo_queue.h $(srcdir)/logsrv_util.h \
330-
$(top_builddir)/config.h
331-
$(CPP) $(CPPFLAGS) $(srcdir)/dotdot.c > $@
332-
dotdot.plog: dotdot.i
333-
rm -f $@; pvs-studio --cfg $(PVS_CFG) --source-file $(srcdir)/dotdot.c --i-file dotdot.i --output-file $@
334-
dotdot_test.o: $(srcdir)/regress/dotdot/dotdot_test.c \
335-
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
336-
$(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \
337-
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
338-
$(srcdir)/logsrv_util.h $(top_builddir)/config.h
339-
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/dotdot/dotdot_test.c
340-
dotdot_test.i: $(srcdir)/regress/dotdot/dotdot_test.c \
341-
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
342-
$(incdir)/sudo_fatal.h $(incdir)/sudo_plugin.h \
343-
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
344-
$(srcdir)/logsrv_util.h $(top_builddir)/config.h
345-
$(CPP) $(CPPFLAGS) $(srcdir)/regress/dotdot/dotdot_test.c > $@
346-
dotdot_test.plog: dotdot_test.i
347-
rm -f $@; pvs-studio --cfg $(PVS_CFG) --source-file $(srcdir)/regress/dotdot/dotdot_test.c --i-file dotdot_test.i --output-file $@
348316
fuzz_logsrvd_conf.o: $(srcdir)/regress/fuzz/fuzz_logsrvd_conf.c \
349317
$(incdir)/compat/stdbool.h $(incdir)/log_server.pb-c.h \
350318
$(incdir)/protobuf-c/protobuf-c.h $(incdir)/sudo_compat.h \

logsrvd/iolog_writer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ create_iolog_path(struct connection_closure *closure)
596596
logsrvd_conf_iolog_dir());
597597
goto bad;
598598
}
599-
if (contains_dot_dot(expanded_dir)) {
599+
if (sudo_contains_dot_dot(expanded_dir)) {
600600
sudo_warnx(U_("unable to expand iolog path %s: path traversal attack"),
601601
logsrvd_conf_iolog_dir());
602602
goto bad;
@@ -608,7 +608,7 @@ create_iolog_path(struct connection_closure *closure)
608608
logsrvd_conf_iolog_file());
609609
goto bad;
610610
}
611-
if (contains_dot_dot(expanded_file)) {
611+
if (sudo_contains_dot_dot(expanded_file)) {
612612
sudo_warnx(U_("unable to expand iolog path %s: path traversal attack"),
613613
logsrvd_conf_iolog_file());
614614
goto bad;

logsrvd/logsrv_util.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ struct connection_buffer {
5353
};
5454
TAILQ_HEAD(connection_buffer_list, connection_buffer);
5555

56-
/* dotdot.c */
57-
bool contains_dot_dot(const char *str);
58-
5956
/* logsrv_util.c */
6057
struct iolog_file;
6158
bool expand_buf(struct connection_buffer *buf, size_t needed);

logsrvd/logsrvd_local.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ decode_log_id(const char *b64_log_id, unsigned char uuid[restrict static 16])
462462
debug_return_str(NULL);
463463
}
464464
path = (char *)&log_id_buf[16];
465-
if (contains_dot_dot(path)) {
465+
if (sudo_contains_dot_dot(path)) {
466466
sudo_warnx("%s", U_("RestartMessage log_id path traversal attack"));
467467
debug_return_str(NULL);
468468
}

0 commit comments

Comments
 (0)