THP Wisec USH DigitalBullets TheHackersPlace network
The WIse SECurity
.italian
.english
Wisec Home SecSearch Progetti Documenti Pensieri in Sicurezza
 
Servizi alle Aziende News Cerca su Wisec
Google

Passbroker per Php

Nascondi le Password negli script Php

Scarica PassBroker

Introduzione:

Se vi e' capitato di chiedervi:
"Come si puo' fare a nascondere negli script PHP username e password per evitare che tali informazioni possano venire visualizzati da utenti non autorizzati, o da cracker che sono riusciti ad entrare nel sistema?"
Siete le persone giuste nel posto giusto e vi consiglio di installare PassBroker sul vostro sito web.

PassBroker e' una estensione per PHP, scritta in c che dispensa informazioni che non vorreste visualizzare direttamente all'interno dello script php secondo regole di accesso definite dall'utente.

- STop Embebbing Password in Scripts (STEPS aka PassBroker):

L'idea iniziale prende spunto dal fatto che nei linguaggi interpretati come php, perl, python, shell o ruby, i file da eseguire sono dei normali file di testo e quindi visionabili da chiunque (ovviamente in concomitanza con i permessi sul file).
La soluzione iniziale consisteva nella creazione di un demone (o servizio) che girasse come root o un modulo del kernel che dispensasse agli interpreti informazioni non condivisibili per poi renderle disponibili agli script sotto forma di variabili.
Il nome del demone doveva essere Steps cioe' STop Embedding Password in Scripts.
Purtroppo tale idea non e' fattibile per una serie di motivi logistici intrinsechi al sistema, allora ho deciso di sfruttare le potenzialita' di apache+php per rendere questa idea una realta' usabile da tutti.

- Cosa e' PassBroker (Pb)?:

Supponiamo che abbiate un accesso a un DBMS, quello che di solito viene fatto e' creare un file di nome config.php in cui vengono settati i valori di username e password per il db mysql, postgres o DBMS che sia:
-----------config.php-------
$user='dbuser';
$passw='dbpassword'
----------------------------

ebbene, tale file deve essere leggibile almeno dall'utente sotto il quale il processo httpd gira (normalmente apache, www-data o http).
poi, tramite una include si rendono accessibili le variabili agli altri script per la connessione al db.
Questo e' di fatto un "information leak" intriseco dei linguaggi interpretati o pseudo compilati.
Quello che si vorrebbe fare e' settare i permessi di config.php in modo tale che utenti non autorizzati non possano visionarlo.

Proviamo ad usare PassBroker.

Il funzionamento di PassBroker e' abbastanza semplice:

create un file pbacl.xml in /etc/pb/
------------pbacl.xml---------------------
<?xml version="1.0"?>
<PassBroker>
  <Trust tid="db1" >
       <File XMLFilename="/etc/pb/acls/acl.xml"  XMLOwnerUId="root" XMLOwnerGId="root" />
  </Trust>
</PassBroker>
-----------------------------------------
$su
#chown root:root /etc/pb/pbacl.xml
#chmod 400 /etc/pb/pbacl.xml

Dove /etc/pb/acls/acl.xml e' il seguente file:
----------acl.xml------------------------------
<?xml version="1.0"  encoding="ISO-8859-1" ?>
<PassBrokerSecret>
   <Secret sid="acl1">
    <Info name="dbname"    value="DBNAME" />
    <Info name="dbserver"  value="localhost" />
    <Info name="tablename" value="ACLtable_name" />
    <Info name="username"  value="ACLuser" />
    <Info name="password"  value="p455w0£d!" />
   </Secret>
</PassBrokerSecret>
-----------------------------------------------
chiamando da config.php

$secretdata=pb_get_info("db1","acl1");

$secret_data si presenterà cosi':
Array
(
    [db1_acl1] => Array
        (
            [dbname] => DBNAME
            [dbserver] => localhost
            [tablename] => ACLtable_name
            [username] => ACLuser
            [password] => p455w0£d!
        )
)
che puo' essere poi utilizzato come un normale array:
Ad esempio:
mysql_connect($secretdata['dbserver'],$secretdata['username'],$secretdata['password']);

Ovviamente se qualcuno puo' scrivere una pagina php nella radice del server web allora puo' accedere ai dati segreti mantenuti in memoria.
Per ovviare a questa problematica sono stati introdotti due tag che permettono di creare una Access Control List ovvero una politica di sicurezza basata sul controllo degli accessi alla risorsa.
Tali tag sono <PHPolicy> e <FromCallerScript> cosi' definiti:
    <PHPolicy>
      <FromCallerScript ScriptName="/home/stefano/public_html/hd/env.php" ScriptFunctionName="getws2" 
                                                ScriptOwnerUId="stefano" ScriptOwnerGId="stefano" >
      [<FromCallerScript ....> ]
      </FromCallerScript>
    </PHPolicy>
Dove
- 'ScriptName' e' il path assoluto del file php che puo' richiedere le risorse,
- 'FuncName' e' il nome della funzione che puo' richiedere le risorse,
- 'ScriptOwnerUId' e' il nome o l'id dell'utente proprietario di 'ScriptName'
- 'ScriptOwnerGId' e' il nome o l'id del gruppo proprietario di 'ScriptName'
Questi tag possono essere inseriti nei file xml cosi':
------------pbacl.xml---------------------
<?xml version="1.0"?>
<PassBroker>
  <Trust tid="db1" >
       <File XMLFilename="/etc/pb/acls/acl.xml"  XMLOwnerUId="root" XMLOwnerGId="root" >
        <PHPolicy>
          <FromCallerScript ScriptName="/home/stefano/public_html/hd/env.php" ScriptFunctionName="getws" 
                                                ScriptOwnerUId="stefano" ScriptOwnerGId="stefano" >
          <FromCallerScript ScriptName="/home/stefano/public_html/hd/inc.php" ScriptFunctionName="pb_get_info" 
                                                ScriptOwnerUId="stefano" ScriptOwnerGId="stefano" />
           </FromCallerScript>
	  </PHPolicy>         
       </File>
  </Trust>
</PassBroker>
-----------------------------------------------

oppure inserendoli in "/etc/pb/acls/acl.xml"
----------acl.xml------------------------------
<?xml version="1.0"  encoding="ISO-8859-1" ?>
<PassBrokerSecret>
   <Secret sid="acl1">
     <Info name="dbname"    value="DBNAME" />
     <Info name="dbserver"  value="localhost" />
     <Info name="tablename" value="ACLtable_name" />
     <Info name="username"  value="ACLuser" />
     <Info name="password"  value="p455w0£d!" />
     <PHPolicy>
     	<FromCallerScript ScriptName="/home/stefano/public_html/hd/env.php" ScriptFunctionName="getws" 
     			    ScriptOwnerUId="stefano" ScriptOwnerGId="stefano" >
     		<FromCallerScript ScriptName="/home/stefano/public_html/hd/inc.php" ScriptFunctionName="pb_get_info" 
     				ScriptOwnerUId="stefano" ScriptOwnerGId="stefano" />
     	   </FromCallerScript>
     </PHPolicy>
   </Secret>
</PassBrokerSecret>
-----------------------------------------------
La differenza e' che se li inserisco in pbacl.xml il controllo avviene su tutti i "segreti" contenuti in "/etc/pb/acls/acl.xml", mentre inserendoli in "/etc/pb/acls/acl.xml" posso generare acl per ogni segreto.
Se volete sapere come fare per essere sicuri che le PHPolicy (o ACL) qui definite sono esatte leggete il paragrafo "Le variabili in php.ini".

- Come funziona Pb :

Passboker nasce come estensione php utilizzabile da Apache server. Infatti il server Apache parte come servizio sotto utente root e 'droppa' i privilegi di root una volta aperta la porta 80, letti i file di configurazione httpd.conf e, a catena, php.ini insieme ad eventuali altri file di configurazione.
Questo vuol dire che i file di configurazione possono essere settati dall'amministratore come file

-r-------- 1 root root 867 nov 1 14:30 pbacl.xml
cioe' con proprietario root e con permessi ristretti dello stesso tipo di /etc/shadow (sola lettura per root).
Il che vuol dire file illeggibili da tutti fuorche' dal loro proprietario (root)!
Sfruttando tutto cio' si e' potuto sviluppare una estensione php che permette di inserire in memoria determinate informazioni e dispensarle in relazione a delle regole definite dall'amministratore del sistema.

- Le variabili in php.ini.

pb.dtddir  
           Valore di default: "/etc/pb/dtds"        PHP_INI_SYSTEM
	   Vi sono due file DTD che definiscono le grammatiche per le due tipologie di file
	   xml (PassBroker e PassBokerSecret), tali DTD  hanno un nome predefinito e sono
	   'PassBroker.dtd' e 'PassBrokerSecret.dtd'. Le dtd devono stare nella stessa directory
	   definita da questa variabile di configurazione. Essendo 'pb.dtddir' una variabile
	   definita come PHP_INI_SYSTEM, non e' modificabile a run time.
pb.aclfile 
           Valore di default: "/etc/pb/pbacl.xml"   PHP_INI_SYSTEM
	   E' il file xml PassBroker dal quale parte tutto.
pb.debug
           Valore di default: "None"                PHP_INI_PERDIR
	   Altri valori permessi: "GenerateACL", "LearnACL"
	   None:
	   	       disattiva qualunque condizione di debug dei file xml.
	   GenerateACL:
	   	       manda in output il gruppo di tag <> ad ogni chiamata
		       diretta o indiretta di pb_get_info(), permettendo cosi' di copiare e incollare
		       le ACL nel proprio file di configurazione.
	   LearnACL:
 			da definirne il comportamento. Dovrebbe servire ad avere un 
			insieme delle chiamate per pagina, cosi' da facilitarne l'inserimento
			nelle regole. Al momento salva in append in un file (/tmp/trust.xml) i valori generati da
			GenerateACL.
			
						

- Consigli:

Se volete creare i giusti permessi e testare la configurazione creata lanciate come root il file eseguibile test_conf e seguite le indicazioni.
$su
#./test_conf
Se volete fare le cose "a mano" eseguite i seguenti comandi da shell:
$su
#mkdir /etc/pb/
#chown root:root /etc/pb/
#chmod 400 /etc/pb/ -R

- Quando PassBroker non serve piu' a niente:

PassBroker si basa sul fatto che vi sono delle regole da mantenere nei settaggi dei permessi. Se tali regole non sono utilizzate l'utilita' di PassBroker diminuisce in proporzione alla facilita' di bucabilita' del vostro spazio web.
Ipotizziamo una serie di fatti che possono variare a seconda del sistema:
- Il server httpd (apache) gira come utente 'apache' gruppo 'apache'
Le situazioni in cui l'utilita' di PassBroker diminuisce o si azzera sono le seguenti:
1.  I vostri script hanno permessi di scrittura per l'utente apache
   e qualcun altro ha accesso alle directory e agli script come utente apache.
   In questo caso e' come se non aveste PassBroker.(echo "$user $password")

2.  Qualche subdirectory della directory radice del sito e' scrivibile da apache.
   In questo caso dovete assicurarvi di avere scritto nel modo giusto il vostro codice PHP o
   le PHPolicy per i vostri Secret/Info, altrimenti e' come se non aveste PassBroker.

3. Include vulnerability. 

4. fopen vulnerability. 

I file e le loro funzioni:

pb_functions.c
sono le funzioni di manipolazione e controllo delle acl.

xmlparser.c
traduttore dalle acl in xml alle strutture dati interne.

system_info.c
routine di controllo dei privilegi.

- Nota Finale - Licenza e utilizzo:

Questo programma e' rilasciato in licenza GPL 2.0 (http://www.gnu.org/copyleft/gpl.html).

Wisec - Un'Idea sviluppata e mantenuta da...

Wisec è scritto e mantenuto da Stefano Di Paola.

Wisec usa standard aperti, inclusi XHTML, PHP e CSS2.

Tutti i Diritti Riservati 2004
Tutti i messaggi e i metadati appartengono ai rispettivi autori.