On Mon, 2020-09-28 at 20:45 -0700, Khem Raj wrote: > On Mon, Sep 28, 2020 at 8:27 AM Khem Raj <raj.k...@gmail.com> wrote: > > On Wed, Sep 23, 2020 at 11:00 PM Yu, Mingli < > > mingli...@windriver.com> wrote: > > > Hi Anuj, > > > > > > On 9/24/20 10:50 AM, Anuj Mittal wrote: > > > > Hi Mingli, > > > > > > > > On Thu, 2020-09-24 at 10:39 +0800, Yu, Mingli wrote: > > > > > From: De Huo <de....@windriver.com> > > > > > > > > > > An issue was discovered in disable_priv_mode in shell.c in > > > > > GNU Bash > > > > > through 5.0 patch 11. By default, if Bash is run with its > > > > > effective > > > > > UID > > > > > not equal to its real UID, it will drop privileges by setting > > > > > its > > > > > effective UID to its real UID. However, it does so > > > > > incorrectly. On > > > > > Linux > > > > > and other systems that support "saved UID" functionality, the > > > > > saved > > > > > UID > > > > > is not dropped. An attacker with command execution in the > > > > > shell can > > > > > use > > > > > "enable -f" for runtime loading of a new builtin, which can > > > > > be a > > > > > shared > > > > > object that calls setuid() and therefore regains privileges. > > > > > However, > > > > > binaries running with an effective UID of 0 are unaffected. > > > > > > > > > > Get the patch from [1] to fix the issue. > > > > > > > > > > [1] > > > > > https://git.savannah.gnu.org/cgit/bash.git/commit/?h=devel&id=951bdaa > > > > > > > > Has something changed from last time this patch was submitted > > > > and later > > > > reverted because of the failing ptest? I remember the author > > > > saying > > > > this isn't a real security bug and there were also changes in > > > > the patch > > > > that weren't related to the CVE ... > > > > > > Changed the patch a little to remove the configure file part to > > > fix the > > > reconfigure issue in v1 patch. > > > > > > Yes, the author saying the patch did fix the issue stated in > > > CVE-2019-18276 though the issue actually is't a big deal. > > > > > > > This seems to be regressing bash ptests now. > > > > ptestresult.bash.run-glob-test > > ptestresult.bash.run-read > > ptestresult.bash.run-trap > > > > These failures are happening without this patch too, so perhaps > something else has caused it, could be perhaps setup related too. > > ptestresult.bash.run-builtins > ptestresult.bash.run-glob-test > ptestresult.bash.run-intl > ptestresult.bash.run-printf > ptestresult.bash.run-read > ptestresult.bash.run-trap > >
Last time this was applied, it had introduced: https://bugzilla.yoctoproject.org/show_bug.cgi?id=13795 because of the unrelated glob changes in this patch. Are you seeing this failure? Thanks, Anuj > > > If its not a real security bug then perhaps its better to revert > > it. > > > > > > > Thanks, > > > > > > > Thanks, > > > > > > > > Anuj > > > > > > > > > Signed-off-by: De Huo <de....@windriver.com> > > > > > Signed-off-by: Kai Kang <kai.k...@windriver.com> > > > > > Signed-off-by: Mingli Yu <mingli...@windriver.com> > > > > > --- > > > > > .../bash/bash/bash-CVE-2019-18276.patch | 386 > > > > > ++++++++++++++++++ > > > > > meta/recipes-extended/bash/bash_5.0.bb | 1 + > > > > > 2 files changed, 387 insertions(+) > > > > > create mode 100644 meta/recipes-extended/bash/bash/bash- > > > > > CVE-2019- > > > > > 18276.patch > > > > > > > > > > diff --git a/meta/recipes-extended/bash/bash/bash-CVE-2019- > > > > > 18276.patch b/meta/recipes-extended/bash/bash/bash-CVE-2019- > > > > > 18276.patch > > > > > new file mode 100644 > > > > > index 0000000000..7b2073201e > > > > > --- /dev/null > > > > > +++ b/meta/recipes-extended/bash/bash/bash-CVE-2019- > > > > > 18276.patch > > > > > @@ -0,0 +1,386 @@ > > > > > +From 951bdaad7a18cc0dc1036bba86b18b90874d39ff Mon Sep 17 > > > > > 00:00:00 > > > > > 2001 > > > > > +From: Chet Ramey <chet.ra...@case.edu> > > > > > +Date: Mon, 1 Jul 2019 09:03:53 -0400 > > > > > +Subject: [PATCH] commit bash-20190628 snapshot > > > > > + > > > > > +An issue was discovered in disable_priv_mode in shell.c in > > > > > GNU Bash > > > > > through 5.0 patch 11. > > > > > +By default, if Bash is run with its effective UID not equal > > > > > to its > > > > > real UID, > > > > > +it will drop privileges by setting its effective UID to its > > > > > real > > > > > UID. > > > > > +However, it does so incorrectly. On Linux and other systems > > > > > that > > > > > support "saved UID" functionality, > > > > > +the saved UID is not dropped. An attacker with command > > > > > execution in > > > > > the shell can use "enable -f" for > > > > > +runtime loading of a new builtin, which can be a shared > > > > > object that > > > > > calls setuid() and therefore > > > > > +regains privileges. However, binaries running with an > > > > > effective UID > > > > > of 0 are unaffected. > > > > > + > > > > > +Get the patch from [1] to fix the issue. > > > > > + > > > > > +Upstream-Status: Inappropriate [the upstream thinks it > > > > > doesn't > > > > > increase the credibility of CVEs in general] > > > > > +CVE: CVE-2019-18276 > > > > > + > > > > > +[1] > > > > > https://git.savannah.gnu.org/cgit/bash.git/commit/?h=devel&id=951bdaa > > > > > + > > > > > +Signed-off-by: De Huo <de....@windriver.com> > > > > > +Signed-off-by: Kai Kang <kai.k...@windriver.com> > > > > > +Signed-off-by: Mingli Yu <mingli...@windriver.com> > > > > > +--- > > > > > + MANIFEST | 2 ++ > > > > > + bashline.c | 50 +----------------------------------- > > > > > -------- > > > > > ------ > > > > > + builtins/help.def | 2 +- > > > > > + config.h.in | 10 +++++++++- > > > > > + configure.ac | 1 + > > > > > + doc/bash.1 | 3 ++- > > > > > + doc/bashref.texi | 3 ++- > > > > > + lib/glob/glob.c | 5 ++++- > > > > > + pathexp.c | 16 ++++++++++++++-- > > > > > + shell.c | 8 ++++++++ > > > > > + tests/glob.tests | 2 ++ > > > > > + tests/glob6.sub | 54 > > > > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > > > > + tests/glob7.sub | 11 +++++++++++ > > > > > + 14 files changed, 122 insertions(+), 56 deletions(-) > > > > > + create mode 100644 tests/glob6.sub > > > > > + create mode 100644 tests/glob7.sub > > > > > + > > > > > +diff --git a/MANIFEST b/MANIFEST > > > > > +index 03de221..f9ccad7 100644 > > > > > +--- a/MANIFEST > > > > > ++++ b/MANIFEST > > > > > +@@ -1037,6 +1037,8 @@ tests/extglob3.tests f > > > > > + tests/extglob3.right f > > > > > + tests/extglob4.sub f > > > > > + tests/extglob5.sub f > > > > > ++tests/glob6.sub f > > > > > ++tests/glob7.sub f > > > > > + tests/func.tests f > > > > > + tests/func.right f > > > > > + tests/func1.sub f > > > > > +diff --git a/bashline.c b/bashline.c > > > > > +index 824ea9d..d86b47d 100644 > > > > > +--- a/bashline.c > > > > > ++++ b/bashline.c > > > > > +@@ -3718,55 +3718,7 @@ static int > > > > > + completion_glob_pattern (string) > > > > > + char *string; > > > > > + { > > > > > +- register int c; > > > > > +- char *send; > > > > > +- int open; > > > > > +- > > > > > +- DECLARE_MBSTATE; > > > > > +- > > > > > +- open = 0; > > > > > +- send = string + strlen (string); > > > > > +- > > > > > +- while (c = *string++) > > > > > +- { > > > > > +- switch (c) > > > > > +- { > > > > > +- case '?': > > > > > +- case '*': > > > > > +- return (1); > > > > > +- > > > > > +- case '[': > > > > > +- open++; > > > > > +- continue; > > > > > +- > > > > > +- case ']': > > > > > +- if (open) > > > > > +- return (1); > > > > > +- continue; > > > > > +- > > > > > +- case '+': > > > > > +- case '@': > > > > > +- case '!': > > > > > +- if (*string == '(') /*)*/ > > > > > +- return (1); > > > > > +- continue; > > > > > +- > > > > > +- case '\\': > > > > > +- if (*string++ == 0) > > > > > +- return (0); > > > > > +- } > > > > > +- > > > > > +- /* Advance one fewer byte than an entire multibyte > > > > > character > > > > > to > > > > > +- account for the auto-increment in the loop above. */ > > > > > +-#ifdef HANDLE_MULTIBYTE > > > > > +- string--; > > > > > +- ADVANCE_CHAR_P (string, send - string); > > > > > +- string++; > > > > > +-#else > > > > > +- ADVANCE_CHAR_P (string, send - string); > > > > > +-#endif > > > > > +- } > > > > > +- return (0); > > > > > ++ return (glob_pattern_p (string) == 1); > > > > > + } > > > > > + > > > > > + static char *globtext; > > > > > +diff --git a/builtins/help.def b/builtins/help.def > > > > > +index 006c4b5..92f9b38 100644 > > > > > +--- a/builtins/help.def > > > > > ++++ b/builtins/help.def > > > > > +@@ -128,7 +128,7 @@ help_builtin (list) > > > > > + > > > > > + /* We should consider making `help bash' do something. */ > > > > > + > > > > > +- if (glob_pattern_p (list->word->word)) > > > > > ++ if (glob_pattern_p (list->word->word) == 1) > > > > > + { > > > > > + printf ("%s", ngettext ("Shell commands matching > > > > > keyword `", > > > > > "Shell commands matching keywords `", (list->next ? 2 : 1))); > > > > > + print_word_list (list, ", "); > > > > > +diff --git a/config.h.in b/config.h.in > > > > > +index 8554aec..ad4b1e8 100644 > > > > > +--- a/config.h.in > > > > > ++++ b/config.h.in > > > > > +@@ -1,6 +1,6 @@ > > > > > + /* config.h -- Configuration file for bash. */ > > > > > + > > > > > +-/* Copyright (C) 1987-2009,2011-2012 Free Software > > > > > Foundation, Inc. > > > > > ++/* Copyright (C) 1987-2009,2011-2012,2013-2019 Free > > > > > Software > > > > > Foundation, Inc. > > > > > + > > > > > + This file is part of GNU Bash, the Bourne Again SHell. > > > > > + > > > > > +@@ -807,6 +807,14 @@ > > > > > + #undef HAVE_SETREGID > > > > > + #undef HAVE_DECL_SETREGID > > > > > + > > > > > ++/* Define if you have the setregid function. */ > > > > > ++#undef HAVE_SETRESGID > > > > > ++#undef HAVE_DECL_SETRESGID > > > > > ++ > > > > > ++/* Define if you have the setresuid function. */ > > > > > ++#undef HAVE_SETRESUID > > > > > ++#undef HAVE_DECL_SETRESUID > > > > > ++ > > > > > + /* Define if you have the setvbuf function. */ > > > > > + #undef HAVE_SETVBUF > > > > > + > > > > > +diff --git a/configure.ac b/configure.ac > > > > > +index 52b4cdb..549adef 100644 > > > > > +--- a/configure.ac > > > > > ++++ b/configure.ac > > > > > +@@ -810,6 +810,7 @@ AC_CHECK_DECLS([confstr]) > > > > > + AC_CHECK_DECLS([printf]) > > > > > + AC_CHECK_DECLS([sbrk]) > > > > > + AC_CHECK_DECLS([setregid]) > > > > > ++AC_CHECK_DECLS[(setresuid, setresgid]) > > > > > + AC_CHECK_DECLS([strcpy]) > > > > > + AC_CHECK_DECLS([strsignal]) > > > > > + > > > > > +diff --git a/doc/bash.1 b/doc/bash.1 > > > > > +index e6cd08d..9e58a0b 100644 > > > > > +--- a/doc/bash.1 > > > > > ++++ b/doc/bash.1 > > > > > +@@ -4681,7 +4681,8 @@ above). > > > > > + .PD > > > > > + .SH "SIMPLE COMMAND EXPANSION" > > > > > + When a simple command is executed, the shell performs the > > > > > following > > > > > +-expansions, assignments, and redirections, from left to > > > > > right. > > > > > ++expansions, assignments, and redirections, from left to > > > > > right, in > > > > > ++the following order. > > > > > + .IP 1. > > > > > + The words that the parser has marked as variable > > > > > assignments (those > > > > > + preceding the command name) and redirections are saved for > > > > > later > > > > > +diff --git a/doc/bashref.texi b/doc/bashref.texi > > > > > +index d33cd57..3065126 100644 > > > > > +--- a/doc/bashref.texi > > > > > ++++ b/doc/bashref.texi > > > > > +@@ -2964,7 +2964,8 @@ is not specified. If the file does > > > > > not exist, > > > > > it is created. > > > > > + @cindex command expansion > > > > > + > > > > > + When a simple command is executed, the shell performs the > > > > > following > > > > > +-expansions, assignments, and redirections, from left to > > > > > right. > > > > > ++expansions, assignments, and redirections, from left to > > > > > right, in > > > > > ++the following order. > > > > > + > > > > > + @enumerate > > > > > + @item > > > > > +diff --git a/lib/glob/glob.c b/lib/glob/glob.c > > > > > +index 398253b..2eaa33e 100644 > > > > > +--- a/lib/glob/glob.c > > > > > ++++ b/lib/glob/glob.c > > > > > +@@ -607,6 +607,7 @@ glob_vector (pat, dir, flags) > > > > > + register unsigned int i; > > > > > + int mflags; /* Flags passed to strmatch (). > > > > > */ > > > > > + int pflags; /* flags passed to sh_makepath > > > > > () */ > > > > > ++ int hasglob; /* return value from > > > > > glob_pattern_p */ > > > > > + int nalloca; > > > > > + struct globval *firstmalloc, *tmplink; > > > > > + char *convfn; > > > > > +@@ -648,10 +649,12 @@ glob_vector (pat, dir, flags) > > > > > + patlen = (pat && *pat) ? strlen (pat) : 0; > > > > > + > > > > > + /* If the filename pattern (PAT) does not contain any > > > > > globbing > > > > > characters, > > > > > ++ or contains a pattern with only backslash escapes > > > > > (hasglob == > > > > > 2), > > > > > + we can dispense with reading the directory, and just > > > > > see if > > > > > there is > > > > > + a filename `DIR/PAT'. If there is, and we can access > > > > > it, just > > > > > make the > > > > > + vector to return and bail immediately. */ > > > > > +- if (skip == 0 && glob_pattern_p (pat) == 0) > > > > > ++ hasglob = 0; > > > > > ++ if (skip == 0 && (hasglob = glob_pattern_p (pat)) == 0 || > > > > > hasglob > > > > > == 2) > > > > > + { > > > > > + int dirlen; > > > > > + struct stat finfo; > > > > > +diff --git a/pathexp.c b/pathexp.c > > > > > +index c1bf2d8..e6c5392 100644 > > > > > +--- a/pathexp.c > > > > > ++++ b/pathexp.c > > > > > +@@ -58,7 +58,10 @@ int extended_glob = EXTGLOB_DEFAULT; > > > > > + /* Control enabling special handling of `**' */ > > > > > + int glob_star = 0; > > > > > + > > > > > +-/* Return nonzero if STRING has any unquoted special > > > > > globbing chars > > > > > in it. */ > > > > > ++/* Return nonzero if STRING has any unquoted special > > > > > globbing chars > > > > > in it. > > > > > ++ This is supposed to be called when pathname expansion is > > > > > performed, so > > > > > ++ it implements the rules in Posix 2.13.3, specifically > > > > > that an > > > > > unquoted > > > > > ++ slash cannot appear in a bracket expression. */ > > > > > + int > > > > > + unquoted_glob_pattern_p (string) > > > > > + register char *string; > > > > > +@@ -85,10 +88,14 @@ unquoted_glob_pattern_p (string) > > > > > + continue; > > > > > + > > > > > + case ']': > > > > > +- if (open) > > > > > ++ if (open) /* XXX - if --open == 0? */ > > > > > + return (1); > > > > > + continue; > > > > > + > > > > > ++ case '/': > > > > > ++ if (open) > > > > > ++ open = 0; > > > > > ++ > > > > > + case '+': > > > > > + case '@': > > > > > + case '!': > > > > > +@@ -106,6 +113,11 @@ unquoted_glob_pattern_p (string) > > > > > + string++; > > > > > + continue; > > > > > + } > > > > > ++ else if (open && *string == '/') > > > > > ++ { > > > > > ++ string++; /* quoted slashes in bracket > > > > > expressions are ok */ > > > > > ++ continue; > > > > > ++ } > > > > > + else if (*string == 0) > > > > > + return (0); > > > > > + > > > > > +diff --git a/shell.c b/shell.c > > > > > +index a2b2a55..6adabc8 100644 > > > > > +--- a/shell.c > > > > > ++++ b/shell.c > > > > > +@@ -1293,7 +1293,11 @@ disable_priv_mode () > > > > > + { > > > > > + int e; > > > > > + > > > > > ++#if HAVE_DECL_SETRESUID > > > > > ++ if (setresuid (current_user.uid, current_user.uid, > > > > > current_user.uid) < 0) > > > > > ++#else > > > > > + if (setuid (current_user.uid) < 0) > > > > > ++#endif > > > > > + { > > > > > + e = errno; > > > > > + sys_error (_("cannot set uid to %d: effective uid > > > > > %d"), > > > > > current_user.uid, current_user.euid); > > > > > +@@ -1302,7 +1306,11 @@ disable_priv_mode () > > > > > + exit (e); > > > > > + #endif > > > > > + } > > > > > ++#if HAVE_DECL_SETRESGID > > > > > ++ if (setresgid (current_user.gid, current_user.gid, > > > > > current_user.gid) < 0) > > > > > ++#else > > > > > + if (setgid (current_user.gid) < 0) > > > > > ++#endif > > > > > + sys_error (_("cannot set gid to %d: effective gid %d"), > > > > > current_user.gid, current_user.egid); > > > > > + > > > > > + current_user.euid = current_user.uid; > > > > > +diff --git a/tests/glob.tests b/tests/glob.tests > > > > > +index 01913bb..fb012f7 100644 > > > > > +--- a/tests/glob.tests > > > > > ++++ b/tests/glob.tests > > > > > +@@ -12,6 +12,8 @@ ${THIS_SH} ./glob1.sub > > > > > + ${THIS_SH} ./glob2.sub > > > > > + ${THIS_SH} ./glob3.sub > > > > > + ${THIS_SH} ./glob4.sub > > > > > ++${THIS_SH} ./glob6.sub > > > > > ++${THIS_SH} ./glob7.sub > > > > > + > > > > > + MYDIR=$PWD # save where we are > > > > > + > > > > > +diff --git a/tests/glob6.sub b/tests/glob6.sub > > > > > +new file mode 100644 > > > > > +index 0000000..b099811 > > > > > +--- /dev/null > > > > > ++++ b/tests/glob6.sub > > > > > +@@ -0,0 +1,54 @@ > > > > > ++# tests of the backslash-in-glob-patterns discussion on the > > > > > austin- > > > > > group ML > > > > > ++ > > > > > ++: ${TMPDIR:=/var/tmp} > > > > > ++ > > > > > ++ORIG=$PWD > > > > > ++GLOBDIR=$TMPDIR/bash-glob-$$ > > > > > ++mkdir $GLOBDIR && cd $GLOBDIR > > > > > ++ > > > > > ++# does the pattern matcher allow backslashes as escape > > > > > characters > > > > > and remove > > > > > ++# them as part of matching? > > > > > ++touch abcdefg > > > > > ++pat='ab\cd*' > > > > > ++printf '<%s>\n' $pat > > > > > ++pat='\.' > > > > > ++printf '<%s>\n' $pat > > > > > ++rm abcdefg > > > > > ++ > > > > > ++# how about when escaping pattern characters? > > > > > ++touch '*abc.c' > > > > > ++a='\**.c' > > > > > ++printf '%s\n' $a > > > > > ++rm -f '*abc.c' > > > > > ++ > > > > > ++# how about when making the distinction between readable > > > > > and > > > > > searchable path > > > > > ++# components? > > > > > ++mkdir -m a=x searchable > > > > > ++mkdir -m a=r readable > > > > > ++ > > > > > ++p='searchable/\.' > > > > > ++printf "%s\n" $p > > > > > ++ > > > > > ++p='searchable/\./.' > > > > > ++printf "%s\n" $p > > > > > ++ > > > > > ++p='readable/\.' > > > > > ++printf "%s\n" $p > > > > > ++ > > > > > ++p='readable/\./.' > > > > > ++printf "%s\n" $p > > > > > ++ > > > > > ++printf "%s\n" 'searchable/\.' > > > > > ++printf "%s\n" 'readable/\.' > > > > > ++ > > > > > ++echo */. > > > > > ++ > > > > > ++p='*/\.' > > > > > ++echo $p > > > > > ++ > > > > > ++echo */'.' > > > > > ++ > > > > > ++rmdir searchable readable > > > > > ++ > > > > > ++cd $ORIG > > > > > ++rmdir $GLOBDIR > > > > > +diff --git a/tests/glob7.sub b/tests/glob7.sub > > > > > +new file mode 100644 > > > > > +index 0000000..0212b8e > > > > > +--- /dev/null > > > > > ++++ b/tests/glob7.sub > > > > > +@@ -0,0 +1,11 @@ > > > > > ++# according to Posix 2.13.3, a slash in a bracket > > > > > expression > > > > > renders that > > > > > ++# bracket expression invalid > > > > > ++shopt -s nullglob > > > > > ++ > > > > > ++echo 1: [qwe/qwe] > > > > > ++echo 2: [qwe/ > > > > > ++echo 3: [qwe/] > > > > > ++ > > > > > ++echo 4: [qwe\/qwe] > > > > > ++echo 5: [qwe\/ > > > > > ++echo 6: [qwe\/] > > > > > +-- > > > > > +1.9.1 > > > > > + > > > > > diff --git a/meta/recipes-extended/bash/bash_5.0.bb > > > > > b/meta/recipes- > > > > > extended/bash/bash_5.0.bb > > > > > index 12d472be57..257a03bd8b 100644 > > > > > --- a/meta/recipes-extended/bash/bash_5.0.bb > > > > > +++ b/meta/recipes-extended/bash/bash_5.0.bb > > > > > @@ -30,6 +30,7 @@ SRC_URI = > > > > > "${GNU_MIRROR}/bash/${BP}.tar.gz;name=tarball \ > > > > > file://run-ptest \ > > > > > file://run-bash-ptests \ > > > > > file://fix-run-builtins.patch \ > > > > > + file://bash-CVE-2019-18276.patch \ > > > > > " > > > > > > > > > > SRC_URI[tarball.md5sum] = > > > > > "2b44b47b905be16f45709648f671820b" > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#142920): https://lists.openembedded.org/g/openembedded-core/message/142920 Mute This Topic: https://lists.openembedded.org/mt/77050061/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-