[PATCH] Fix buffer overflow for 'Include' parameter in pacman.conf

Allan McRae allan at archlinux.org
Thu Jul 21 10:13:14 UTC 2022


On 10/1/22 20:40, tim174 wrote:
> If the 'Include' parameter in the config file is set to a long string
> (for example 3000x '/') the pacman config parser will crash when calling glob
> in conf.c with this value. If the string is shorter than approx. 3000 symbols
> the normal error message is printed and the segfault does not occur.
> 
> I was able to reproduce this on my own system and on the official Arch Linux
> iso image. The PATH_MAX variable is too large to prevent this bug,
> hence the new variable GLOB_LIMIT with a security buffer of 1000
> since I don't know how persistent this limit is across systems.
> Its origin is unclear to me and I am not sure if it is a fixed value.
> This is why I would appreciate any help to make this a sustainable patch.
> 
> Thanks
> Tim
> 

I guess this comes down to this section that is just below your change....

/* Ignore include failures... assume non-critical */

I'd assume you are hitting "GLOB_NOSPACE".  We should probably give 
proper errors here and for "GLOB_ABORTED".

Allan

> Signed-off-by: Tim <tim174 at protonmail.com>
> ---
>   src/pacman/conf.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)
> 
> diff --git a/src/pacman/conf.c b/src/pacman/conf.c
> index f9edf75b..d8222752 100644
> --- a/src/pacman/conf.c
> +++ b/src/pacman/conf.c
> @@ -65,6 +65,9 @@ config_t *config = NULL;
>   #define BOLDWHITE     "\033[1;37m"
>   #define GREY46        "\033[38;5;243m"
> 
> +/* limit for glob input variable */
> +#define GLOB_LIMIT 2000
> +
>   void enable_colors(int colors)
>   {
>          colstr_t *colstr = &config->colstr;
> @@ -1042,6 +1045,13 @@ static int process_include(const char *value, void *data,
>                  return 1;
>          }
> 
> +       if(strlen(value) > GLOB_LIMIT) {
> +               pm_printf(ALPM_LOG_ERROR,
> +                               ("config file %s, line %d, directive '%s': value too long\n"),
> +                               file, linenum, "Include");
> +               return 1;
> +       }
> +
>          if(section->depth >= config_max_recursion) {
>                  pm_printf(ALPM_LOG_ERROR,
>                                  _("config parsing exceeded max recursion depth of %d.\n"),
> --
> 2.34.1
> .



More information about the pacman-dev mailing list