Question:
Quels risques de sécurité y a-t-il à autoriser quelqu'un à télécharger des scripts PHP?
Michael d
2018-03-21 17:58:33 UTC
view on stackexchange narkive permalink

Disons qu'un partenaire souhaite télécharger un script PHP sur mon serveur Apache. Quel genre de chaos pourrait être causé par cela?

Quels paramètres PHP posent des menaces? Si ces paramètres PHP sont complètement désactivés, autoriser l'insertion de PHP sur mes serveurs serait-il alors sûr?

Voici quelques paramètres PHP que je connais qui posent une faille de sécurité. Quels sont les autres éléments non sécurisés?

Ecriture sur le serveur:

  1. fwrite

  2. file_get_contents

  3. FILE_APPEND

Ouverture de fichiers sur le serveur:

  1. fopen

  2. file_get_contents

  3. inclure

  4. fread

  5. url_get_contents

  6. curl_init

  7. curl_setopt

Suppression de fichiers:

  1. dissocier
  2. unset

Y a-t-il d'autres failles de sécurité auxquelles je devrais réfléchir avant d'autoriser les partenaires à ajouter des fichiers .php sur mon serveur? J'imagine qu'il y en a peut-être beaucoup dont je ne suis pas au courant.

Je m'inquiète également des scripts en boucle qui pourraient utiliser toute ma RAM et mon processeur, les attaques d'accès par porte dérobée, les logiciels malveillants et autres. Y a-t-il des mesures que je peux prendre pour empêcher que tout cela et plus ne se produise?

S'il y a du Javascript, JQuery ou d'autres langages intégrés dans le script PHP, sont-ils également dangereux? Et quel type de paramètres dans d'autres langues devrais-je désactiver pour protéger mon serveur?

Comment les sites Web comme jsfiddle et codepen assurent-ils la sécurité de leurs sites tout en permettant aux gens de publier leur propre code?

Un bac à sable pourrait vous aider.Voir [Existe-t-il un sandbox PHP, quelque chose comme JSFiddle est à JS?] (Https://stackoverflow.com/q/4616159) et Google `PHP sandbox`.
Quel est votre cas d'utilisation?Voulez-vous que leur PHP fasse partie de votre site?
Juste pour être clair, vous avez l'intention d'exécuter le PHP?Vous ne laissez pas simplement les gens le télécharger sous forme de code?
J'ai quelqu'un qui aimerait mettre du PHP sur mon site, un peu comme l'externalisation.Ils ont un bon code.Je voudrais juste savoir s'il existe un moyen d'éviter une catastrophe en cas de comportement malveillant.Si j'avais une liste de commandes que je pourrais vérifier, je pourrais revoir le code pour m'assurer qu'il n'y a rien de caché qui soit dangereux.Le PHP est destiné à fonctionner sur le site.Et il pourrait contenir d'autres langages tels que javascript, jquery, ajax, etc.
Salut @NeilSmithline, si j'exécutais un sandbox PHP avec quelque chose comme Runkit_Sandbox, le PHP soumis serait-il sûr à 100%?Ou y a-t-il encore un moyen pour les gens de corrompre le serveur via sandbox?
Je ne suis pas un expert du sandbox PHP, mais je ne pense pas qu'un sandbox offre une sécurité à 100%.Mais ils essaient.Il s'agit donc d'une stratégie à faible risque, mais pas sans risque.
Il semble que vous souhaitiez que le code s'exécute réellement et fournisse une partie des fonctionnalités de votre site, auquel cas le sandboxing (même si vous pouvez le garantir) n'aidera pas car il essaie d'éviter cela.S'il s'agit de ce type de développement collaboratif, vous vous en occuperiez dans le cadre de votre processus de déploiement - c'est un scénario différent de celui de fournir aux gens un moyen de télécharger du code sur votre site et de l'exécuter.
Même avec un bac à sable parfait, vous avez toujours des abus potentiels: que se passe-t-il si son script utilise beaucoup de CPU / mémoire?Si vous avez activé l'accès aux fichiers ou au réseau, il peut également utiliser toutes ces ressources.
Les autres langages seront-ils limités à des éléments côté client comme JavaScript, HTML, etc.?Ou y aura-t-il aussi des trucs comme du code bash?De plus, vous inquiétez-vous pour la sécurité de votre * utilisateur * ou simplement pour vos propres sites?
Après réflexion, je pense que c'est une bonne chose à poser, mais cela devrait probablement être plusieurs questions liées en raison de la portée par rapport au niveau de connaissances de départ (à moins que la réponse que vous recherchez soit simplement "il y a une tonne dechoses dangereuses, ne faites pas cela sans recherche »).Je vote pour fermer comme "trop large", mais veuillez interpréter cela comme une suggestion de séparer plusieurs questions plus étroites!par exemple, "JavaScript en PHP est-il dangereux", "quelles sortes de choses dangereuses PHP peut-il faire sur un serveur", "comment puis-je désactiver ces choses dangereuses (spécifiques) en PHP", etc.
Si la quantité de scripts téléchargés que vous attendez est faible, envisagez de les opposer manuellement avant de les rendre disponibles pour exécution.
Dans un commentaire, vous dites "genre de sous-traitance semblable".Si cette personne _ travaille_ pour vous (même si ce n'est que sur une base ad hoc), alors peut-être qu'un contrat solide (avec des clauses "ne sera pas malicieusement ..._") est une approche alternative / supplémentaire.Et si vous ne lui faites pas confiance pour être un employé (ou équivalent), vous ne devriez probablement pas prendre leur code.
Réponse courte: 3e guerre mondiale!
Je ne comprends pas pourquoi vous faites * télécharger * des fichiers php à cette personne sur votre site.Je veux dire: s'il veut contribuer, alors il devrait faire des pull requests sur le référentiel de votre code source, afin que vous puissiez les examiner et les accepter / les refuser ...
Huit réponses:
hmrojas.p
2018-03-21 20:47:14 UTC
view on stackexchange narkive permalink

C'est très dangereux, car vous autorisez quelqu'un à télécharger un fichier PHP avec un code inconnu et des intentions inconnues, donc si vous avez besoin de cette fonctionnalité dans le cadre de votre site Web, vous devez renforcer votre serveur, par exemple:

  • Définissez un seul répertoire pour télécharger les fichiers PHP des utilisateurs, vous devez appliquer les autorisations utilisateur appropriées (lecture, écriture ou exécution) pour ce répertoire, n'oubliez pas de créer un utilisateur spécifique pour ce répertoire, et non pas d'utiliser l'utilisateur root.
    • / li>
    • Vous pouvez créer un fichier .htaccess pour le répertoire, puis vous pouvez définir des paramètres spécifiques pour ce répertoire ( Configuration du fichier .htaccess).
    • Valider l'utilisateur d'entrée, même vous devriez définir un format de nom spécifique et une taille maximale pour les fichiers PHP, si un fichier PHP ne correspond pas à ce format ou si sa taille est plus grande que ce qui est autorisé, alors l'application ne devrait pas permettre à l'utilisateur de télécharger ce fichier.
    • Utilisez la canonisation avant d'utiliser les fonctions de fichier, par exemple: realpath, basename. Cela vous aide à éviter les attaques de traversée de chemin.
    • Vous devez désactiver les fonctions PHP à haut risque, par exemple: exec, shell_exec. Vous pouvez le faire via le fichier php.ini, par exemple, vous pouvez ajouter la ligne suivante aide à désactiver les fonctions pour l'exécution des commandes du système d'exploitation et la gestion des paramètres:

        disable_functions = exec, passthru, shell_exec, système , proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source  

      La ligne suivante permet de désactiver les fonctions d'inclusion ou d'ouverture de fichiers à partir de sources externes:

        allow_url_fopen = Offallow_url_include = Off  

    Fichier php.ini de la documentation officielle

    Voici quelques recommandations de base. Vous devez analyser votre application Web et vos besoins pour définir les bons paramètres pour votre serveur et votre application Web.

    J'espère que ces informations vous aideront.

Définissez un seul répertoire pour télécharger les fichiers PHP des utilisateurs - Cela ne devrait-il pas être un répertoire par utilisateur.(Ainsi, chaque utilisateur externe a un répertoire spécifique et un utilisateur local spécifique qui exécute le code à partir de ce répertoire)
@Taemyr vous avez raison, cela pourrait être un autre niveau de sécurité.
Que vous passiez plus de 95% de cette réponse à expliquer comment essayer de sécuriser le serveur me dérange énormément.Ce devrait être l'inverse: passer 95% de la réponse à la décourager et 5% à parler de ce que vous pouvez faire.
@jpmc26 Ok, je comprends votre point car c'est un sujet dangereux, pour cette raison j'ai dit "Si vous avez besoin de cette fonctionnalité ..." avant d'expliquer mes recommandations, maintenant ce ne sont que des recommandations, il peut décider de les suivre ou non, aussice site concerne la sécurité et comment résoudre ce genre de problèmes, pas les éviter, donc les utilisateurs de ce site sont des professionnels et ils doivent parfois essayer de résoudre des problèmes avant de décider de ne pas continuer avec une solution, pour les raisons que j'ai envisagées de donnerquelques recommandations, mais je respecte votre point de vue.
N'oubliez pas le potentiel de voler des cookies et de contourner les politiques de sécurité liées au domaine, cela devra être isolé sur un domaine séparé.Je désactiverais également eval et create_function
@hmrojas.p "Ce site traite de la sécurité et comment résoudre ce genre de problèmes, pas les éviter."Je suis manifestement en désaccord.Très souvent, la seule réponse sensée en matière de sécurité est: «Ne faites pas ça».Et aussi très souvent, si vous devez vous demander si quelque chose de largement connu comme dangereux est un risque, vous n'avez tout simplement pas les connaissances nécessaires pour essayer de vous en défendre, et le temps et l'argent dépensés à essayer de s'en défendre ne sont tout simplement pas un bon investissement..
Jacco
2018-03-21 19:21:14 UTC
view on stackexchange narkive permalink

Si vous autorisez quelqu'un à télécharger et exécuter un script PHP sur votre serveur, vous donnez effectivement à cette personne le droit de faire tout ce qu'elle peut faire, si elle avait un accès ssh avec un nom d'utilisateur / mot de passe pour le traitement du script PHP .

Donc, si la personne en question exécutait le script via Apache, la personne pourrait faire tout ce que l'utilisateur Apache sur votre serveur pourrait faire.

En tant que risque supplémentaire, cette personne pourrait utiliser l'accès donné pour tenter une escalade de privilèges, ce qui enfreindrait probablement l'accord juridique que vous avez avec eux (vous avez un accord juridique, n'est-ce pas?).

Si j'avais une liste de commandes qui présentent un risque pour la sécurité, je pourrais rechercher ces commandes et revoir le code pour m'assurer que tout semble sûr.Ou y a-t-il trop de choses qui pourraient mal tourner et qu'une liste de commandes ne suffit pas?
PHP est un langage de programmation qui permet la programmation.Donc si je crée mycmd = 'c' + 'a' + 't' + '' '+'> '+' / '+' e '+' t '+' c '+' / '+ ... quoiallez-vous grep pour?Si je deviens plus complexe ... La réponse simple est qu'il n'y a pas de moyen simple d'exécuter du code non fiable en toute sécurité.
@AdamShostack Grep pour toute commande qui interprète une chaîne comme du code (par exemple, eval), et toute commande qui passe une chaîne au système d'exploitation (par exemple, exec).La chaîne mycmd à elle seule n'est pas un danger.(Ce n'est pas que je recommande d'autoriser des étrangers à télécharger PHP, - ou d'exiger une liste noire pour être une protection suffisante si vous le faites)
@Taemyr: PHP a plusieurs façons d'exécuter des fonctions de manière dynamique, par exemplehttp://php.net/manual/en/functions.variable-functions.php
@Taemyr J'ai hâte de vous voir faire fortune avec votre nouvel outil d'analyse statique génial qui rend cela sûr.
@Taemyr, qui pourrait fonctionner dans un langage sensé, mais c'est PHP dont nous parlons.
La liste noire d'@Michaeld, n'est pas une solution qui fonctionne, il y a * beaucoup * trop d'options pour contourner les listes noires;c'est un fait qui a été montré trop souvent.La liste blanche dans ce cas ne fonctionne que si vous pouvez garantir que vous êtes plus intelligent que les connaissances combinées de toutes les personnes susceptibles d'utiliser votre système.
@Taemyr https: // ideone.com / lBVfRW et non, vous ne pouvez pas simplement mettre sur liste noire `rkrp`, car je peux trouver une infinité de façons de le masquer.
@gronostaj vous manquez le point de mon commentaire.Je me fiche vraiment de la façon dont vous obscurcissez le contenu d'une variable.Si je ne peux pas vous empêcher d'exécuter le contenu d'une variable que j'ai déjà perdue.
-1
@Taemyr * "Charmant. Qui a pensé que c'était une bonne idée?" * À peu près sûr que cela pourrait être dit de la plupart des PHP en général.
@Taemyr "Si je ne peux pas vous empêcher d'exécuter le contenu d'une variable que j'ai déjà perdue" - je crois que c'est ce que je veux dire.Vous ne pouvez pas, il existe de nombreuses façons d'y parvenir en PHP et c'est une partie essentielle de la structure de la métaprogrammation.
@anaximander [En effet] (https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/).(Un peu daté maintenant, mais * toujours *.)
Et pour le [plaisir] (http://phpsadness.com/)!Ce sont tous des cas réels, des erreurs de plage libre, testés, détectés par un programmeur.
Juste pour renforcer le point @gronostaj's, voici un autre script php qui utilise exec pour envoyer un script à un autre programme:
Anders
2018-03-22 14:51:09 UTC
view on stackexchange narkive permalink

Il me semble que vous êtes sur le point de vous tirer une balle dans le pied. Laisser des personnes en qui vous n'avez pas confiance télécharger et exécuter PHP sur votre serveur est extrêmement dangereux. Voici certaines choses qu'un attaquant pourrait essayer:

  • Exécutez des commandes batch prenant le contrôle de votre serveur Web. Il peut ensuite être utilisé comme terrain de transit pour attaquer d'autres serveurs depuis votre réseau.
  • Lire des fichiers contenant des secrets, par exemple mots de passe, clés de chiffrement, clés TLS, etc.
  • Faites des attaques XSS (en utilisant JavaScript) pour voler des cookies de session ou d'autres informations d'identification de vos utilisateurs. Cela suppose que les fichiers téléchargés fonctionnent sur le même domaine ou un sous-domaine que d'autres applications.

La liste s'allonge encore et encore. Il existe des moyens pour essayer de bloquer ces attaques ( hmrojas.p a quelques suggestions), mais ce n’est pas simple. Les fonctions de liste noire sont un début, mais la liste noire n'est jamais qu'une défense partielle. Même pour les meilleurs experts, contenir quelqu'un qui peut exécuter PHP est un défi.

En fin de compte, si vous ne faites pas confiance à la personne qui a écrit le code, vous devrez vérifier soigneusement et manuellement le code pour s'assurer qu'il est bénin. Cela prend du temps et des efforts et n'est pas compatible avec le téléchargement direct de fichiers.

Parfois, le seul coup gagnant est de ne pas jouer. Je dirais que c'est l'un de ces cas.

Je pense que je sais ce que vous voulez dire ici, mais faire confiance au code ne le rend pas sûr.Désolé d'être pédant, mais j'ai vu des gens se perdre dans de telles choses et faire le contraire de ce qu'ils devraient faire.
@JimmyJames De toute évidence, la confiance peut être mal placée, et il peut évidemment encore y avoir des erreurs.Mais par définition, si votre confiance est bien placée, il n'y a pas de problèmes délibérés avec le code.Je vais essayer de modifier pour le rendre plus clair.
Je suppose que ce que j'essaie de dire, c'est qu'une relation de confiance devrait être considérée comme un risque important.Vous ne présumez pas seulement que la partie de confiance ne sera pas néfaste, mais aussi qu'elle dispose d'une sécurité adéquate et protège ses informations d'identification.Cela crée également des opportunités pour des tiers de subvertir cette relation de confiance via des failles.Votre modification semble résoudre ce problème.
Machavity
2018-03-21 22:53:32 UTC
view on stackexchange narkive permalink

Bien qu'il existe des sites qui vous permettent d'exécuter du code PHP à la demande (c'est-à-dire 3v4l), ils limitent sévèrement ce que vous pouvez faire et sauter à travers quelques obstacles majeurs pour le faire en toute sécurité

J'utilise une configuration où les scripts sont exécutés dans une petite machine virtuelle. Pour des raisons de sécurité, cette machine n'a pas de réseau et seulement un système de fichiers minimal. Les scripts sont exécutés par un démon (écrit en Golang) et les résultats (avec statistiques) sont rapportés à une base de données PostgreSQL. Tous les résultats sont stockés et utilisés pour fournir des moyennes pour l'aperçu des performances.

Je n'autoriserais pas les utilisateurs à télécharger des scripts PHP dans un environnement en direct. Une fois, nous avons eu un stagiaire qui écrivait un script de téléchargement d'image. Sauf qu'il a oublié de valider quoi que ce soit sur le dossier qu'il acceptait. Quelqu'un a téléchargé un script de malware PHP depuis la Turquie et a tenté de le prendre en charge (il se serait également débrouillé avec lui sans d'autres efforts de sécurité sur le serveur).

allo
2018-03-22 17:39:10 UTC
view on stackexchange narkive permalink

PHP a beaucoup de fonctions pour désactiver les fonctionnalités et restreindre certaines actions afin qu'il puisse être utilisé dans des scénarios d'hébergement partagé. Il est donc beaucoup plus sûr de permettre aux gens de télécharger des scripts php que des scripts perl, lorsque votre serveur Web et votre instance php sont correctement configurés.

Je veux donc aborder autre chose que la sécurité d'urlopen et similaire: Vous autorisez les gens à gérer des sites interactifs.

Les conséquences sont dangereuses indépendamment de la quantité d'E / S réseau ou disque qu'ils peuvent générer, car ils peuvent par exemple configurer un site de phishing reflètent mal votre domaine et votre réputation IP.

Donc, vous ne vous retrouvez pas sur une liste noire à cause des spams car ils sont bloqués en interdisant à php d'envoyer du courrier, mais peut-être parce que vous exécutez un script qui hameçonne les connexions Facebook de l'utilisateur.

Miles Prower
2018-03-23 00:47:05 UTC
view on stackexchange narkive permalink

Vous mentionnez un serveur Apache, mais pas si PHP est installé ou non.

Chaque logiciel peut être utilisé / installé sans l'autre.

Les deux logiciels sont disponibles pour plusieurs systèmes d'exploitation .. vous n'avez pas mentionné ce qui est en jeu ici.

Dans le cas où PHP est installé sur le serveur:

Le risque est que, devrait le compte utilisateur sous PHP finit par fonctionner sous, ils ont des droits d'administration sur la machine, ils peuvent tout faire dans la bibliothèque PHP.

Si ce compte n'a pas de droits administratifs, cela limite ce qu'ils peuvent faire.

Certains systèmes d'exploitation ont des exploits détectables / connus permettant aux comptes non administratifs d '«obtenir» des droits administratifs. Ce sont des exploits d’escalade de privilèges. Si on en utilise, alors encore ... ils peuvent faire n'importe quoi dans la bibliothèque PHP.

Dans le cas où PHP n'est pas installé sur le serveur:

Il y a peu ou pas de risque à tout. Un fichier PHP est juste un fichier texte d'instructions que PHP interprète et agit sur. Ce n'est pas plus dangereux qu'un fichier texte avec une recette de ragoût.

John Keates
2018-03-23 05:34:45 UTC
view on stackexchange narkive permalink

Il n'y a aucun moyen de «sécuriser» cela. Toute quantité de permettre à quelqu'un / n'importe qui d'exécuter du code à volonté sur un système peut conduire à une prise de contrôle complète du système, soit en raison de l'exécution de toutes les instructions, soit en raison de défauts dans le système qui tente d'empêcher certaines fonctions d'être utilisées.

Même un langage de script dans une prison / chroot / conteneur en tant qu'utilisateur dédié peut en fin de compte exploiter des vulnérabilités (existantes / nouvelles) qui permettent un accès root complet et plus (c'est-à-dire un accès au firmware). C'est ce à quoi les hébergeurs mutualisés doivent faire face toute la journée. La plupart de la prévention et de la réparation vient de deux choses:

  1. Légal; lister ce qu'ils peuvent et ne peuvent pas faire dans un contrat à l'avance

  2. Processus; ont mis en place des redondances et des plans de récupération; traitent les violations / pertes

Marcin
2018-03-22 21:33:30 UTC
view on stackexchange narkive permalink

Oui, vous allez vouloir faire du bac à sable. Le moyen le plus simple de le faire est probablement de l'exécuter dans une VM ou un conteneur docker . Bien sûr, vous devrez alors auditer la sécurité à ce sujet.

Non c'est faux.Il est possible d'échapper à un conteneur Docker, il existe des exploits documentés pour cela (certains plus difficiles que d'autres, mais nous y sommes).Étant donné que le [démon Docker s'exécute en tant que root] (https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface), faire confiance à Docker pour conserver le code malveillant contenu semble peu judicieux.En fin de compte, emprisonner le code non approuvé (même par virtualisation) n'a pas beaucoup d'importance lorsque vous devez également protéger les services à l'intérieur de cette même prison.
@korrigan Lorsque vous dites «services [dans la] même prison», voulez-vous dire des services dans le même bac à sable, ou d'autres services sur la même machine hôte?Mon hypothèse est qu'il n'y a pas de protection des choses qui sont ensemble dans le même bac à sable.
Du commentaire d'OP: "Le PHP est destiné à fonctionner sur le site.".Oui, je voulais dire dans le même bac à sable (ou prison).Votre hypothèse est juste à cet égard.
@korrigan De toute évidence.Vous voudriez séparer la diffusion de la diffusion ici.Par exemple.avoir le serveur php en cours d'exécution dans la vm, et le reste du site en dehors de cette prison.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...