pam-1.1.8-cve-2014-2583.patch 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. From 9dcead87e6d7f66d34e7a56d11a30daca367dffb Mon Sep 17 00:00:00 2001
  2. From: "Dmitry V. Levin" <ldv@altlinux.org>
  3. Date: Wed, 26 Mar 2014 22:17:23 +0000
  4. Subject: [PATCH] pam_timestamp: fix potential directory traversal issue
  5. (ticket #27)
  6. pam_timestamp uses values of PAM_RUSER and PAM_TTY as components of
  7. the timestamp pathname it creates, so extra care should be taken to
  8. avoid potential directory traversal issues.
  9. * modules/pam_timestamp/pam_timestamp.c (check_tty): Treat
  10. "." and ".." tty values as invalid.
  11. (get_ruser): Treat "." and ".." ruser values, as well as any ruser
  12. value containing '/', as invalid.
  13. Fixes CVE-2014-2583.
  14. Reported-by: Sebastian Krahmer <krahmer@suse.de>
  15. ---
  16. modules/pam_timestamp/pam_timestamp.c | 13 ++++++++++++-
  17. 1 file changed, 12 insertions(+), 1 deletion(-)
  18. diff --git a/modules/pam_timestamp/pam_timestamp.c b/modules/pam_timestamp/pam_timestamp.c
  19. index 5193733..b3f08b1 100644
  20. --- a/modules/pam_timestamp/pam_timestamp.c
  21. +++ b/modules/pam_timestamp/pam_timestamp.c
  22. @@ -158,7 +158,7 @@ check_tty(const char *tty)
  23. tty = strrchr(tty, '/') + 1;
  24. }
  25. /* Make sure the tty wasn't actually a directory (no basename). */
  26. - if (strlen(tty) == 0) {
  27. + if (!strlen(tty) || !strcmp(tty, ".") || !strcmp(tty, "..")) {
  28. return NULL;
  29. }
  30. return tty;
  31. @@ -243,6 +243,17 @@ get_ruser(pam_handle_t *pamh, char *ruserbuf, size_t ruserbuflen)
  32. if (pwd != NULL) {
  33. ruser = pwd->pw_name;
  34. }
  35. + } else {
  36. + /*
  37. + * This ruser is used by format_timestamp_name as a component
  38. + * of constructed timestamp pathname, so ".", "..", and '/'
  39. + * are disallowed to avoid potential path traversal issues.
  40. + */
  41. + if (!strcmp(ruser, ".") ||
  42. + !strcmp(ruser, "..") ||
  43. + strchr(ruser, '/')) {
  44. + ruser = NULL;
  45. + }
  46. }
  47. if (ruser == NULL || strlen(ruser) >= ruserbuflen) {
  48. *ruserbuf = '\0';
  49. --
  50. 1.8.3.1