comment supprimer un fichier en mode taint

Le
ecureuil
Bonjour,

Je crée des fichiers temporaires dans mon programme que j'aimerai supprimer
quand le fichier définitif est créé.

J'ai essayé avec rm ou unlink, veut pas supprimer..

Vous faites comment pour supprimer des fichiers en mode taint?

J'avais pensé appeler un petit pgm perl sans le mode taint pour supprimer
mes fichiers temporaires

Voua avez quelle astuce pour faire cela?

merci
anne
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Delf
Le #84488

Je crée des fichiers temporaires dans mon programme que j'aimerai supprimer
quand le fichier définitif est créé.

J'ai essayé avec rm ou unlink, veut pas supprimer..


Problème de droit ?

Vous faites comment pour supprimer des fichiers en mode taint?


Quelques pistes:

`rm -f mon_fichier > /dev/null`;
system "rm -f mon_fichier > /dev/null"
my $NumberOfFilesRemoved = unlink 'mon_fichier';

J'avais pensé appeler un petit pgm perl sans le mode taint pour supprimer
mes fichiers temporaires...


Mode taint ? C'est-à-dire ?

--
Delf

Jérémy JUST
Le #84487
On Mon, 3 Jan 2005 17:49:55 +0100
"ecureuil"
J'ai essayé avec rm ou unlink, veut pas supprimer..


Ça marche pour moi, au moins quand le nom du fichier est une
constante:

$ touch truc
$ perl -T -e 'print unlink "truc"'
1
$ perl -T -e 'print unlink "truc"'
0


Vous faites comment pour supprimer des fichiers en mode taint?


Fais attention: d'après perldoc perlsec, tu ne peux pas passer à
unlink() une variable non vérifiée (« tainted »).


J'avais pensé appeler un petit pgm perl sans le mode taint pour
supprimer mes fichiers temporaires...


Je pense que tu n'as pas besoin de hacks aussi sombres. Le mode « -T »
ne servirait à rien s'il obligeait à des manoeuvres aussi susceptibles
d'ouvrir des failles.

--
Jérémy JUST
ecureuil
Le #84486
"Delf" 41d9c873$0$21788$
|
| > Je crée des fichiers temporaires dans mon programme que j'aimerai
supprimer
| > quand le fichier définitif est créé.
| >
| > J'ai essayé avec rm ou unlink, veut pas supprimer..
|
| Problème de droit ?

Les droits sont bons!
C'est le mode dans lequel s'execute le pgm qui n'accepte pas certaines
commandes...
Tout cela pour sécuriser les pgms de mon interface web!

|
| > Vous faites comment pour supprimer des fichiers en mode taint?
|
| Quelques pistes:
|
| `rm -f mon_fichier > /dev/null`;
| system "rm -f mon_fichier > /dev/null"
| my $NumberOfFilesRemoved = unlink 'mon_fichier';

Marche pas avec le mode taint...

|
| > J'avais pensé appeler un petit pgm perl sans le mode taint pour
supprimer
| > mes fichiers temporaires...
|
| Mode taint ? C'est-à-dire ?

#!/usr/bin/perl -wT

C'est le "T"...
J'essaie de mettre tous les pgms de mon interface web avec ce mode...
et je coince sur 2 pgms...
Les autres sont ok!

anne
ecureuil
Le #84485
"Jérémy JUST"
| On Mon, 3 Jan 2005 17:49:55 +0100
| "ecureuil" |
| > J'ai essayé avec rm ou unlink, veut pas supprimer..
|
| Ça marche pour moi, au moins quand le nom du fichier est une
| constante:
|
| $ touch truc
| $ perl -T -e 'print unlink "truc"'
| 1
| $ perl -T -e 'print unlink "truc"'
| 0
|

oui, j'ai essayé cela marche aussi chez moi! (avec une constante!)

|
| > Vous faites comment pour supprimer des fichiers en mode taint?
|
| Fais attention: d'après perldoc perlsec, tu ne peux pas passer à
| unlink() une variable non vérifiée (« tainted »).
|
Dans mon pgm, ce sont des variables... tous les fichiers temporaires... au
minimum 6...!!!
$aleat1correspond à $$

opendir DIR, "$webtmpabs" || print "$cant_open_outgoing $$webtmpabsn";
foreach $DATEI ( readdir DIR )
{
if ($DATEI =~ /^($aleat1).*$/)
{
print "<br> 3------------------------------------$DATEI-
<br>n";
print unlink "$webtmpabs/$DATEI";
}
}
closedir (DIR);

Insecure dependency in unlink while running with -T !!!
Connait bien le msg! ;o))

Dans perlsec :
unlink $data, $arg; => non sûr

Vous pourriez me dire comment vérifier une variable avec l'exemple de
"$webtmpabs/$DATEI"
C'est le chemin absolu du fichier. Il contient donc des /, des points, des
tirets...
J'ai déjà essayé et je n'arrive pas à grand chose... mais il suffit d'une
virgule mal placé ou d'un blanc en trop...!!!

| > J'avais pensé appeler un petit pgm perl sans le mode taint pour
| > supprimer mes fichiers temporaires...
|
| Je pense que tu n'as pas besoin de hacks aussi sombres. Le mode « -T »
| ne servirait à rien s'il obligeait à des manoeuvres aussi susceptibles
| d'ouvrir des failles.
|
C'est bien ce que je pense...

anne
ecureuil
Le #84484
"ecureuil" 41d9f192$0$31571$
|
| "Jérémy JUST" news:
|
|| On Mon, 3 Jan 2005 17:49:55 +0100
|| "ecureuil" ||
||
|| > Vous faites comment pour supprimer des fichiers en mode taint?
||
|| Fais attention: d'après perldoc perlsec, tu ne peux pas passer à
|| unlink() une variable non vérifiée (« tainted »).
||
| Dans mon pgm, ce sont des variables... tous les fichiers temporaires... au
| minimum 6...!!!
| $aleat1correspond à $$
|
| opendir DIR, "$webtmpabs" || print "$cant_open_outgoing $$webtmpabsn";
| foreach $DATEI ( readdir DIR )
| {
| if ($DATEI =~ /^($aleat1).*$/)
| {
| print "<br> 3------------------------------------$DATEI-
| <br>n";
| print unlink "$webtmpabs/$DATEI";
| }
| }
| closedir (DIR);
|

OPERATION REUSSIE

opendir DIR, "$webtmpabs" || print "$cant_open_outgoing $$webtmpabsn";
foreach $DATEI ( readdir DIR )
{
if ($DATEI =~ /^($aleat1).*$/)
{
print "<br> 3------------------------------------$DATEI-
<br>n";
if ($DATEI =~ /^([-w.]+)$/)
{
print "<br> 4--$1--$DATEI--<br>n";
$DATEI = $1;
print "<br> 4--$1--$DATEI--<br>n";
}
if ($webtmpabs =~ /^([-/w.]+)$/)
{
print "<br> 5--$1--$webtmpabs--<br>n";
$webtmpabs = $1;
print "<br> 5--$1--$webtmpabs--<br>n";
}
unlink ("$webtmpabs/$DATEI");
}
}
closedir (DIR);

Cela supprime les fichiers temporaires!

Il reste encore la conversion du fichier ps en fichier pdf...
J'ai réussi à convertir les fichiers g3 en fichier pbm, les fichiers pbm en
fichiers ps, à mettre dans un fichier ps tous les fichiers ps (avec cat),
mais pour la conversion du fichier ps en pdf...

La cde appelée : ps2pdf13

cat /usr/bin/ps2pdf13
----------------
#!/bin/sh
# $Id: ps2pdf13,v 1.1 2000/03/09 08:40:40 lpd Exp $
# Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).

exec ps2pdfwr -dCompatibilityLevel=1.3 "$@"
---------------
/usr/bin/ps2pdf13: /home/.../cgi-bin/fax/ps2pdfwr: Aucun fichier ou
r?pertoire de ce type
/usr/bin/ps2pdf13: exec: /home/.../cgi-bin/fax/ps2pdfwr: cannot execute:
Aucun fichier ou r?pertoire de ce type
1 at /home/.../cgi-bin/fax/nph-vf-pdf.cgi line 706.

au lieu d'aller chercher la cde dans /usr/bin/ps2pdfwr il va la chercher là
où le script perl s'exécute...
J'ai essayé de modifier ps2pdf13 mais c'est ps2pdfwr qui plante....
J'ai modifié ps2pdfwr pour donner le bon chemin à la cde basename et à la
cde gs...
et là plus de message d'erreur explicite, à part :
1 at /home/.../cgi-bin/fax/nph-vf-pdf.cgi line 706.

J'ai regardé les paramètres passés à chaque cde appelée, c'est ok...

Si vous aviez des idées...
Et j'aimerai comprendre pourquoi je dois donner les bons chemins dans les 2
scripts sh : ps2pdf13et ps2pdfwr...
gs est un pgm compilé.

anne
Paul Gaborit
Le #84483
À (at) Tue, 4 Jan 2005 06:40:27 +0100,
"ecureuil"
if ($DATEI =~ /^([-w.]+)$/)
{
$DATEI = $1;
}
[...]


Avant l'affectation, la variable $DATEI contient le résultat de la lecture
d'un répertoire : c'est une valeur qui provient de l'extérieur de votre script
donc elle est considérée comme tainted ou souillée (non sûre).

À partir du moment où vous la remplacez par ce qui a été reconnu par
l'expression régulière, elle devient sûre (non souillée ou untainted).

C'est la responsabilité du programmeur de s'assurer que l'expression régulière
utilisée sécurise bien la valeur.

Il reste encore la conversion du fichier ps en fichier pdf...
J'ai réussi à convertir les fichiers g3 en fichier pbm, les fichiers pbm en
fichiers ps, à mettre dans un fichier ps tous les fichiers ps (avec cat),
mais pour la conversion du fichier ps en pdf...

La cde appelée : ps2pdf13

cat /usr/bin/ps2pdf13
----------------
#!/bin/sh
# $Id: ps2pdf13,v 1.1 2000/03/09 08:40:40 lpd Exp $
# Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).

exec ps2pdfwr -dCompatibilityLevel=1.3 "$@"
---------------
/usr/bin/ps2pdf13: /home/.../cgi-bin/fax/ps2pdfwr: Aucun fichier ou
r?pertoire de ce type
/usr/bin/ps2pdf13: exec: /home/.../cgi-bin/fax/ps2pdfwr: cannot execute:
Aucun fichier ou r?pertoire de ce type
1 at /home/.../cgi-bin/fax/nph-vf-pdf.cgi line 706.

au lieu d'aller chercher la cde dans /usr/bin/ps2pdfwr il va la chercher là
où le script perl s'exécute...
J'ai essayé de modifier ps2pdf13 mais c'est ps2pdfwr qui plante....
J'ai modifié ps2pdfwr pour donner le bon chemin à la cde basename et à la
cde gs...
et là plus de message d'erreur explicite, à part :
1 at /home/.../cgi-bin/fax/nph-vf-pdf.cgi line 706.

J'ai regardé les paramètres passés à chaque cde appelée, c'est ok...

Si vous aviez des idées...
Et j'aimerai comprendre pourquoi je dois donner les bons chemins dans les 2
scripts sh : ps2pdf13et ps2pdfwr...
gs est un pgm compilé.


Le mode taint (-T) vous oblige soit à n'utiliser que des commandes dont vous
donnez le chemin d'accès absolu soit à définir proprement la variable
d'environnement PATH. Par exemple :

$ENV{PATH} = "/bin:/usr/bin";

Dans votre cas, seul la seconde solution peut fonctionner puisque le script
ps2pdf13 n'utilise pas de chemin absolu (sauf en le modifiant comme vous
l'avez fait). Vous pourriez aussi shunter 'ps2pdf13' en passant vous même la
bonne option (-dCompatibilityLevel=1.3) à ps2pdfwr ou même à 'gs' directement.

Quant à la dernière erreur, il faudrait voir la ligne 706 de votre script cgi.

--
Paul Gaborit - Perl en français -
ecureuil
Le #84482
"Paul Gaborit" news:

|
| > Il reste encore la conversion du fichier ps en fichier pdf...
| > J'ai réussi à convertir les fichiers g3 en fichier pbm, les fichiers pbm
en
| > fichiers ps, à mettre dans un fichier ps tous les fichiers ps (avec
cat),
| > mais pour la conversion du fichier ps en pdf...
| >
| > La cde appelée : ps2pdf13
| >
| > cat /usr/bin/ps2pdf13
| > ----------------
| > #!/bin/sh
| > # $Id: ps2pdf13,v 1.1 2000/03/09 08:40:40 lpd Exp $
| > # Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).
| >
| > exec ps2pdfwr -dCompatibilityLevel=1.3 "$@"
| > ---------------
| > /usr/bin/ps2pdf13: /home/.../cgi-bin/fax/ps2pdfwr: Aucun fichier ou
| > r?pertoire de ce type
| > /usr/bin/ps2pdf13: exec: /home/.../cgi-bin/fax/ps2pdfwr: cannot execute:
| > Aucun fichier ou r?pertoire de ce type
| > 1 at /home/.../cgi-bin/fax/nph-vf-pdf.cgi line 706.
| >
| > au lieu d'aller chercher la cde dans /usr/bin/ps2pdfwr il va la chercher

| > où le script perl s'exécute...
| > J'ai essayé de modifier ps2pdf13 mais c'est ps2pdfwr qui plante....
| > J'ai modifié ps2pdfwr pour donner le bon chemin à la cde basename et à
la
| > cde gs...
| > et là plus de message d'erreur explicite, à part :
| > 1 at /home/.../cgi-bin/fax/nph-vf-pdf.cgi line 706.
| >
| > J'ai regardé les paramètres passés à chaque cde appelée, c'est ok...
| >
| > Si vous aviez des idées...
| > Et j'aimerai comprendre pourquoi je dois donner les bons chemins dans
les 2
| > scripts sh : ps2pdf13et ps2pdfwr...
| > gs est un pgm compilé.
|
| Le mode taint (-T) vous oblige soit à n'utiliser que des commandes dont
vous
| donnez le chemin d'accès absolu soit à définir proprement la variable
| d'environnement PATH. Par exemple :
|
| $ENV{PATH} = "/bin:/usr/bin";
|
| Dans votre cas, seul la seconde solution peut fonctionner puisque le
script
| ps2pdf13 n'utilise pas de chemin absolu (sauf en le modifiant comme vous
| l'avez fait). Vous pourriez aussi shunter 'ps2pdf13' en passant vous même
la
| bonne option (-dCompatibilityLevel=1.3) à ps2pdfwr ou même à 'gs'
directement.
|

ps2pdf13 et ps2pdfwr proviennent du rpm de "ghostscript-7.03-0.i386.rpm"
J'ai ajouté PATH=/usr/bin:/bin dans ces 2 pgms...
J'ai bien mis $ENV{PATH} = "/bin:/usr/bin"; dans le programme cgi mais le
path n'est pas passé au pgm appelé...
J'ai peut-être fait encore une erreur en définissant proprement la variable
d'environnement PATH?

$ENV{PATH} = "";
$ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin";

| Quant à la dernière erreur, il faudrait voir la ligne 706 de votre script
cgi.
|
J'avais fait une erreur que je ne voyais pas tellement c'était gros :o))

anne
ecureuil
Le #84251
"ecureuil" 41dab5ed$0$21781$
|
|| Le mode taint (-T) vous oblige soit à n'utiliser que des commandes dont
| vous
|| donnez le chemin d'accès absolu soit à définir proprement la variable
|| d'environnement PATH. Par exemple :
||
|| $ENV{PATH} = "/bin:/usr/bin";
||
|| Dans votre cas, seul la seconde solution peut fonctionner puisque le
| script
|| ps2pdf13 n'utilise pas de chemin absolu (sauf en le modifiant comme vous
|| l'avez fait). Vous pourriez aussi shunter 'ps2pdf13' en passant vous même
| la
|| bonne option (-dCompatibilityLevel=1.3) à ps2pdfwr ou même à 'gs'
| directement.
||
|

Pas besoin de ce que j'avais mis dans les pgm de ghostcript (les PATH)
Tout est ok ...
Le pgm marche super avec le mode taint...
Merci à tous...

Il ne me reste plus qu'à ajouter les messages d'erreur dans gettext et cela
sera nickel! (facile ça!)

Maintenant, il faut juste que je potasse pour que les messages d'erreur
apparaissent là où je veux...
perlipc a pas mal d'infos...
Si vous avez d'autres pistes d'infos...sur les pipe, les redirections...avec
des exemples pour que je teste... je ne maitrise pas bien la chose!
(même pas du tout!)
L'autre pgm, qui ne fonctionne pas avec -T, a ce genre de chose!

anne
Poster une réponse
Anonyme