[Phpmyadmin-devel] MOPB-02-2007 deep recursion,

Marc Delisle Marc.Delisle at cegepsherbrooke.qc.ca
Thu Mar 1 16:32:10 CET 2007


Sebastian Mendel a écrit :
> Marc Delisle schrieb:
>> Sebastian Mendel a écrit :
>>> Michal Čihař schrieb:
>>>> Hi
>>>>
>>>> On Thu, 01 Mar 2007 15:30:59 +0100
>>>> Sebastian Mendel <lists at sebastianmendel.de> wrote:
>>>>
>>>>> http://www.php-security.org/MOPB/MOPB-02-2007.html
>>>>>
>>>>> i did not fully 'understand' how we are affected, but i think we are 
>>>>> affected somehow ... especially as i come to the sentence wehre phpMyAdmin 
>>>>> is explicitely mentioned ...
>>>> This is IMHO PHP problem and causes problems because single line of our
>>>> code gets executed...
>>> yes of course it is a PHP problem ... but the globals overwrite is also a 
>>> PHP problem and we do check for this ...
>>>
>>> a simple counter wuld help, or?
>>>
>>> teh only place where we would be possible attackable with this is when we 
>>> iterate over $GLOBALS or $_REQUEST ($_POST, $_COOKIE, $_GET)
>>>
>>>
>>> common.lib.php#2651
>>> /**
>>>   * Check for numeric keys
>>>   * (if register_globals is on, numeric key can be found in $GLOBALS)
>>>   */
>>> $i = 0;
>>> foreach ($GLOBALS as $key => $dummy) {
>>>      if (++$i >= 1000) {
>>>          die('possible deep recurse attack');
>>>      }
>>>      if (is_numeric($key)) {
>>>          die('numeric key detected');
>>>      }
>>> }
>>>
>>>
>>> and
>>>
>>>
>>> /**
>>>   * calls $function vor every element in $array recursively
>>>   *
>>>   * @uses    PMA_arrayWalkRecursive()
>>>   * @uses    is_array()
>>>   * @uses    is_string()
>>>   * @param   array   $array      array to walk
>>>   * @param   string  $function   function to call for every array element
>>>   */
>>> function PMA_arrayWalkRecursive(&$array, $function, $apply_to_keys_also = false)
>>> {
>>>      static $recursive_counter = 0;
>>>      if (++$recursive_counter > 1000) {
>>>          die('possible deep recursion attack');
>>>      }
>>>      foreach ($array as $key => $value) {
>>>          if (is_array($value)) {
>>>              PMA_arrayWalkRecursive($array[$key], $function, 
>>> $apply_to_keys_also);
>>>          } else {
>>>              $array[$key] = $function($value);
>>>          }
>>>
>>>          if ($apply_to_keys_also && is_string($key)) {
>>>              $new_key = $function($key);
>>>              if ($new_key != $key) {
>>>                  $array[$new_key] = $array[$key];
>>>                  unset($array[$key]);
>>>              }
>>>          }
>>>      }
>>>      $recursive_counter--;
>>> }
>>>
>>>
>>> what would be a good value? 10.000? but we never will need such much vars, 
>>> so even 1.000 would be enough? (count all all variables that be available 
>>> when register_globals = on)
>> Yes, I was thinking about adding a limit, your analysis seems OK to me. 
>> A limit of 1000 is enough (even a smaller value would be correct like 
>> 100 I guess).
> 
> yes, i thought about 100 also first! but this is too low - i have found 
> without any $_REQUEST 211 vars ...
> 
> function myCount($var)
> {
>      static $count = 0;
>      $count++;
>      if (is_array($var)) {
>          foreach ($var as $name => $each_var) {
>              if ($name !== 'GLOBALS') {
>                  myCount($each_var);
>              }
>          }
>      }
>      $GLOBALS['count'] = $count;
> }
> 
> myCount($GLOBALS);
> 
> var_dump($count);
> 
> 
> i think with 1000 we are on the safe side ...
> 
> 
>> Did you test this patch?
> 
> no - i have no linux where i can do easily this magic call with thousends of 
> vars ... ;-)
> 
> curl http://127.0.0.1/phpmyadmin/ -d a`php -r 'echo str_repeat("[a]",1001);'`=1
> 
> 

Ok, if you want to commit to trunk, I'll test here. Then we'll probably 
release 2.10.0.2.

Now, what do we do with
http://sourceforge.net/tracker/index.php?func=detail&aid=1647030&group_id=23067&atid=377408

they want security fixes published as patches. It's more work for us, 
but I can understand distro maintainers.

Marc




More information about the Developers mailing list