la funzione del backend che filtra i valori prima di passarli alla shell:
int CmdArgToSafeArg(char *param_1,undefined *param_2,size_t param_3)
{
char cVar1;
size_t sVar2;
int iVar3;
size_t sVar4;
if ((param_1 == (char *)0x0) || (param_2 == (undefined *)0x0)) {
printf("CmdArgToSafeShellArg Arg is NULL, error");
}
else {
sVar2 = strlen(param_1);
if (-1 < (int)sVar2) {
iVar3 = sVar2 * 2 + 3;
if ((int)param_3 < iVar3) {
printf("iSafeLen(%d) less than iLengthtmp(%d),len(%s)=(%d),error\n",param_3,iVar3,param_1,
sVar2);
return 0xfffffffe;
}
memset(param_2,0,param_3);
*param_2 = 0x22;
iVar3 = 0;
sVar4 = 0;
while (sVar4 != sVar2) {
cVar1 = *param_1;
if ((((cVar1 == '\"') || (cVar1 == '$')) || (cVar1 == '`')) || (cVar1 == '\\')) {
param_2[iVar3 + 1] = 0x5c;
iVar3 = iVar3 + 2;
param_2[iVar3] = *param_1;
}
else {
iVar3 = iVar3 + 1;
param_2[iVar3] = cVar1;
}
sVar4 = sVar4 + 1;
param_1 = param_1 + 1;
}
param_2[iVar3 + 1] = 0x22;
param_2[iVar3 + 2] = 0;
return iVar3 + 2;
}
printf("CmdArgToSafeShellArg iLength(%d) is error\n",sVar2);
}
return 0xffffffff;
}
dopo di lei, nello specifico per il parental, il comando viene costruito così
snprintf(acStack1560,0x200,
"iptables %s %s -p tcp --dport 80 -m urlfilter --urlkey \"%s\" -j %s",param_2,
param_3 + 0x20,auStack1048,&local_658)
(param2, param3 e local_658 sono costruiti dal programma stesso. auStack1048 è puntato dal secondo parametro di CmdArgToSafeArg)
edit: prima di essere salvato in memoria nessun valore sembra essere pesantemente controllato. il backend lua si limita a controllare che arrivino stringhe. (non ne sono del tutto certo, approfondirò) il filtraggio di cui sopra è effettuato postumo, leggendo i valori dal db delle configurazioni, subito prima di passare questi a iptables