A PHP one-liner is being bandied about as one test of the recently discovered 
Ghost vulnerability in gethostbyname(). Taken from:

http://ma.ttias.be/quick-tests-ghost-gethostbyname-vulnerability-cve-2015-0235/

Here it is:

% php -r '$e="0";for($i=0;$i<2500;$i++){$e="0$e";} gethostbyname($e);’

What’s not being discussed is how it works. From the naive viewpoint of a PHP 
end-user, I’d expect this one-liner to have the same effect:

% php -r '$e="0$e"; gethostbyname($e);’

But it doesn’t. Can someone familiar with PHP’s internals explain why this code 
triggers the overflow, and whether it will actually do so reliably?

More importantly, does this indicate any problems with PHP? It seems like the 
loop should just be optimized away to a single assignment, but even if the 
engine isn’t smart enough to do that, I’d still expect that the same few bytes 
of memory at the same memory address would simply get set to the same value 
over and over. This code suggests that’s not the case, though, that there are 
side-effects. Also, just by lowering the counter to 2499, I get a completely 
different outcome on one particular server:

*** glibc detected *** double free or corruption (out): 0x0000000000acce20 ***
Aborted

FWIW, here’s some C that was provided to more directly check for the 
vulnerability:

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof 
(*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char 
*) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), 
&result, &herrno);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}



--
Bob Williams
Business Unit Information Officer and
Senior Vice President of Software Development
Newtek Business Services Corp.
(602) 263-0300 x12458 | http://www.thesba.com/


________________________________
Notice: This communication, including attachments, may contain information that 
is confidential. It constitutes non-public information intended to be conveyed 
only to the designated recipient(s). If the reader or recipient of this 
communication is not the intended recipient, an employee or agent of the 
intended recipient who is responsible for delivering it to the intended 
recipient, or if you believe that you have received this communication in 
error, please notify the sender immediately by return e-mail and promptly 
delete this e-mail, including attachments without reading or saving them in any 
manner. The unauthorized use, dissemination, distribution, or reproduction of 
this e-mail, including attachments, is prohibited and may be unlawful. If you 
have received this email in error, please notify us immediately by e-mail or 
telephone and delete the e-mail and the attachments (if any).

Reply via email to