Description: The mod_nvram module was developed specifically to monitor configuration settings stored in nvram on Linksys devices. In the future, this module could be used to monitor other attributes of similar devices. Version: 0.1 --- osiris-4.1.8-orig/src/osirisd/modules/mod_nvram/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ osiris-4.1.8-1/src/osirisd/modules/mod_nvram/Makefile 2005-04-22 23:11:32.000000000 +0200 @@ -0,0 +1,16 @@ + +include ../Makefile + +SRCS=mod_nvram.c +OBJS=$(SRCS:.c=.o) + +module: ${SRCS} ${OBJS} + +INCS=-I../.. -I../../../libosiris -I../../../libfileapi -I../../../.. + +# meta-rule for compiling any "C" source file. +$(OBJS): $(SRCS) + $(CC) $(DEFS) $(DEFAULT_INCLUDES) ${INCLUDES} ${INCS} $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $(SRCS) + cp $@ .. + --- osiris-4.1.8-orig/src/osirisd/modules/mod_nvram/README 1970-01-01 01:00:00.000000000 +0100 +++ osiris-4.1.8-1/src/osirisd/modules/mod_nvram/README 2005-04-22 23:11:32.000000000 +0200 @@ -0,0 +1,40 @@ + +Module: mod_nvram +Author: Brian Wotring (brian@shmoo.com) + + + +DESCRIPTION: + +The mod_nvram module reads the key=value pairs stored in nvram. This +is primarily for Linksys routers, but could be modified to run on +other systems if necessary. On the routers like the WRT54G, the +nvram settings hold sensitive information that needs to be monitored. +The format for the record structure is as follows: + + name:value + +USE: + +To use this module, all that is needed is to include it in the System +block of a scan configuration, e.g.: + + + ... + Include mod_nvram + ... + + + +PARAMETERS: + +There are no parameters for this module. + +PLATFORMS: + +Currently, only for the Linksys WRT54G and WRT54GS devices. + +NOTES: + + + --- osiris-4.1.8-orig/src/osirisd/modules/mod_nvram/mod_nvram.c 1970-01-01 01:00:00.000000000 +0100 +++ osiris-4.1.8-1/src/osirisd/modules/mod_nvram/mod_nvram.c 2005-04-22 23:11:32.000000000 +0200 @@ -0,0 +1,142 @@ + +/****************************************************************************** +** +** This program is free software; you can redistribute it and/or +** modify it, however, you cannot sell it. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +** +** You should have received a copy of the license attached to the +** use of this software. If not, visit www.shmoo.com/osiris for +** details. +** +******************************************************************************/ + +/***************************************************************************** +** +** File: mod_users.c +** Date: January 1, 2004 +** +** Author: Brian Wotring +** Purpose: platform specific methods for reading user file information. +** +******************************************************************************/ + +#include "libosiris.h" +#include "libfileapi.h" +#include "rootpriv.h" +#include "common.h" +#include "version.h" + +#include "scanner.h" +#include "logging.h" + + +#define NVRAM_PATH "/usr/sbin/nvram" +#define NVRAM_ARG "show" + +static const char *MODULE_NAME = "mod_nvram"; + + +void mod_nvram( SCANNER *scanner ) +{ + int pid; + int pc[2]; + int cp[2]; + char temp_line[4096]; + FILE *file; + SCAN_RECORD_TEXT_1 record; + + if( pipe(pc) < 0) + { + log_error( "mod_nvram: error creating pipe!" ); + return; + } + + if( pipe(cp) < 0) + { + log_error( "mod_nvram: error creating pipe!" ); + return; + } + + /* Create a child to run nvram command. */ + + switch( pid = fork() ) + { + case -1: + log_error( "nvram: fork error!" ); + return; + + case 0: + + /* child */ + + close(1); + dup( cp[1]); + close(0); + close( pc[1]); + close( cp[0]); + execl( NVRAM_PATH, NVRAM_PATH, NVRAM_ARG, NULL ); + exit(0); + + default: + + /* parent */ + + close(pc[1]); + close(cp[1]); + + file = fdopen( cp[0], "r" ); + + for(;;) + { + char *line; + char *key_end; + + line = fgets( temp_line, sizeof( temp_line ), file ); + + if( line == NULL) + { + break; + } + + line = trim_white_space( line ); + + /* skip commented and empty lines. */ + + if( ( line == NULL ) || ( line[0] == '#' ) ) + { + continue; + } + + /* locate the username, this is the first item in the colon list. */ + + if( ( key_end = strchr( line, '=' ) ) == NULL ) + { + continue; + } + + initialize_scan_record( (SCAN_RECORD *)&record, + SCAN_RECORD_TYPE_TEXT_1 ); + + osi_strlcpy( record.module_name, MODULE_NAME, + sizeof( record.module_name ) ); + + /* user the key as a key/path for this record. */ + + (*key_end) = '\0'; + key_end++; + osi_strlcpy( record.name, "nvram:", sizeof( record.name ) ); + osi_strlcat( record.name, line, sizeof( record.name ) ); + + /* now copy in the value into the data portion. */ + /* and send this record on its way. */ + + osi_strlcpy( record.data, key_end, sizeof( record.data ) ); + send_scan_data( scanner, (SCAN_RECORD *)&record ); + } + } +} +