[SECURITY-L] ntp leakage: ntp version, processor and OS info

Daniela Regina Barbetti Silva daniela em ccuec.unicamp.br
Sex Jun 13 09:01:24 -03 2003


----- Forwarded message from Klaus Steding-Jessen <jessen em nic.br> -----

From: Klaus Steding-Jessen <jessen em nic.br>
Subject: [IRT-L] ntp leakage: ntp version, processor and OS info
To: irt-l em listas.unesp.br
Date: Thu, 12 Jun 2003 17:58:45 -0300

Caros,

A informacao a seguir nao e' nenhuma novidade, mas vale a pena ser
relembrada.

E' trivial para um atacante colher remotamente informacoes sobre
versao de ntpd, arquitetura e sistema operacional (muitas vezes com
versao) apenas rodando o comando ntpq e realizando queries do tipo
NTP mode 6 e mode 7 a um servidor NTP.

Depende da politica de seguranca de cada instituicao permitir que
essas informacoes saiam da sua rede, quer seja via NTP ou outro
metodo.  Acho importante, entretanto, que todos estejam a par do tipo
de informacao que pode ser fornecida, especialmente instituicoes que
mantem servidores de NTP publicos.

Seria interessantes que os participantes da lista verificassem se os
servidores NTP das suas instituicoes estao revelando mais informacoes
do que o permitido pelas suas politicas de seguranca e/ou bom senso.

Um detalhe: para que um atacante colha as informacoes nao e'
necessario que a maquina sirva tempo -- dependendo de como estiver
configurada pode rodar ntpd apenas como cliente e mesmo assim fornecer
essas informacoes.

Exemplos das informacoes fornecidas sao mostradas abaixo: (algumas
linhas foram omitidas por brevidade e os hostnames sanitizados)

======================================================================

$ ntpq -c cv -c rl machine
version="ntpd 4.1.0-a Sat Jun  7 15:26:48 BRT 2003 (1)",
processor="i386", system="FreeBSD4.8-STABLE"

======================================================================

$ ntpq -c cv -c rl machine
version="ntpd 4.0.99m-rc2 Tue Jun 26 17:27:59 EST 2001 (1)",
processor="i386", system="OpenBSD2.8"

======================================================================

$ ntpq -c cv -c rl machine
system="OpenVMS AXP"

======================================================================

$ ntpq -c cv -c rl machine
version="ntpd 4.0.99k23 Sun Apr  8 01:40:30 EDT 2001 (4)",
processor="sun4m", system="SunOS5.5.1"

======================================================================

$ ntpq -c cv -c rl machine
version="ntpd 4.1.1 em 1.786 Fri Apr 25 16:25:22 BRT 2003 (1)",
processor="i686", system="Linux2.4.18"

======================================================================


Na configuracao do ntpd e' possivel restringir esse tipo de query
(mode 6 e mode 7), sem afetar o servico de tempo, por exemplo, com:

restrict default noquery

Essa solucao, entretanto, restringe outras queries que podem ser uteis
para clientes determinarem a qualidade de tempo servido por um dado
servidor ntp.

Outra solucao e' recompilar o ntpd com um patch para sanitizar as
informacoes sensiveis de sistema.  No final deste mail segue um patch
desenvolvido pelo Frederico Neves, do registro.br, com este fim.
Sintam-se a vontade para usar e mesmo repassar esse patch, desde que o
autor original seja mencionado.  E' possivel que pequenas modificacoes
ao patch sejam necessarias, dependendo da versao de ntpd utilizada.

Apos a aplicacao do patch, a saida passa a ser, por exemplo:

$ ntpq -c cv -c rl machine
version="ntpd", processor="x86", system="Unix"


Abracos,
Klaus.

NIC BR Security Office <nbso em nic.br>
http://www.nbso.nic.br/

*** /usr/src/contrib/ntp/ntpd/ntp_control.c.orig	Tue Dec  3 16:14:43 2002
--- /usr/src/contrib/ntp/ntpd/ntp_control.c	Tue Dec  3 16:25:41 2002
***************
*** 1245,1251 ****
  		    sizeof(str_processor) - 1);
  #else
  		ctl_putstr(sys_var[CS_PROCESSOR].text,
! 		    utsnamebuf.machine, strlen(utsnamebuf.machine));
  #endif /* HAVE_UNAME */
  		break;
  
--- 1245,1251 ----
  		    sizeof(str_processor) - 1);
  #else
  		ctl_putstr(sys_var[CS_PROCESSOR].text,
! 		    "x86", strlen("x86"));
  #endif /* HAVE_UNAME */
  		break;
  
***************
*** 1254,1268 ****
  		ctl_putstr(sys_var[CS_SYSTEM].text, str_system,
  		    sizeof(str_system) - 1);
  #else
! 		(void)strcpy(str, utsnamebuf.sysname);
! 		(void)strcat(str, utsnamebuf.release);
  		ctl_putstr(sys_var[CS_SYSTEM].text, str, strlen(str));
  #endif /* HAVE_UNAME */
  		break;
  
  	case CS_VERSION:
! 		ctl_putstr(sys_var[CS_VERSION].text, Version,
! 		    strlen(Version));
  		break;
  
  	case CS_STABIL:
--- 1254,1267 ----
  		ctl_putstr(sys_var[CS_SYSTEM].text, str_system,
  		    sizeof(str_system) - 1);
  #else
! 		(void)strcpy(str, "Unix");
  		ctl_putstr(sys_var[CS_SYSTEM].text, str, strlen(str));
  #endif /* HAVE_UNAME */
  		break;
  
  	case CS_VERSION:
! 		ctl_putstr(sys_var[CS_VERSION].text, "ntpd",
! 		    strlen("ntpd"));
  		break;
  
  	case CS_STABIL:


----- End forwarded message -----



Mais detalhes sobre a lista de discussão SECURITY-L