• [^] # Re: Magie !

    Posté par . En réponse au journal Aider au développement d'un nouveau gestionnaire de paquets. Évalué à 2.

    Oh j'ai trouvé, comment ais-je pu ne pas y penser.

    La GPL et la LGPL demandent qu'on distribue les sources avec les binaires, du moins quand on modifie. Tous les paquets ne sont pas GPL, mais on peut s'aider de cette demande.

    Quand un paquet est créé par Setup, les binaires sont placés dans /tmp/lgrpackages/paquet_src. Les sources qui ont construit ce paquet se trouvent dans /tmp/lgrpackages/paquetversion_src.

    Il "suffit" de réempaqueter les sources et de les joindre aux paquets binaires. Elles seront aussi envoyées au serveur, et comparées avec les sources "officielles". Si elles ne sont pas les mêmes, on fait un diff, et si le patch est intéressant, on l'applique aux sources officielles.

    Pour que ce soit un minimum secure, il faut éxécuter les actions dans cet ordre (le but est d'empêcher l'éventuel cracker de modifier les sources avant, pendant ou après la compilation/création du paquet) :

    - l'archive source est téléchargée, puis décompressée. On calcul un md5 de l'archive tar obtenue
    - les fichiers de l'archive sont décompressés dans /tmp/lgrpackages/paquetversion_src (le cracker a déjà perdu ses modifs ici ^^ )
    - un md5 de toutes ces sources est calculé (avec un re-tarage), et comparé au premier.
    - Si les hash ne correspondent pas, on quitte tout
    - On stocke le timestamp actuel
    - On compile le paquet
    - On supprime tous les fichiers plus récents que le timestamp actuel (la compilation ne modifie normalement pas de fichiers source, mais c'est à vérifier).
    - On recalcul le md5 des sources, et on recompare
    - Si ce n'est pas bon, on quitte tout
    - le recalcul aura créé une archive tar. On la compresse en lzma, et on l'envoie avec le paquet, ainsi que le hash du tar non-compressé.
    - sur le serveur, le hash envoyé est comparé avec le hash des sources officielles décompressées.
    - si le hash ne correspond pas, on refuse le paquet.

    Normalement, pas moyen de passer outre :) . Quelques questions maintenant.

    > Pourquoi calculer les hash sur des archives tar non-compressées ?

    On doit calculer pas mal de hash ici, et un md5sum (ou sha256sum) est bien plus rapide qu'un passage par lzma ou bzip2. De plus, les sources officielles sont normalement en lzma, mais peuvent aussi être en bzip2, z, etc.

    > Comment faire pour SVN ?

    La séquence est assez simple (et s'applique aussi à git et autres) :

    o svn checkout
    o calcul du md5
    o svn log doit être vide
    o calcul du md5

    Les deux md5 doivent être les mêmes, sinon ça veut dire que l'utilisateur a modifié des fichiers. De plus, l'emplacement des dépots SVN récupérés est placé dans /var/setup/cache/hash_sha_du_nom_du_dépot. Ainsi, un script malicieux a plus de mal à détecter et à modifier le dépot.


    Malheureusement, tout cela ralentit vraiment fortement la création de paquets, et ne devrait donc être activé que quand l'utilisateur veut envoyer son paquet.

    De plus, étant open-source, le pirate pourra très facilement modifier Setup pour faire sauter la protection. Malheureusement, la GPL v3 interdit de placer un code de vérification dans Setup qui l'empêche de démarrer s'il a été modifié.

    Problème hyper épineux.