MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    [BUG] FML : FMLSecurityManager

    Planifier Épinglé Verrouillé Déplacé Discussion générale
    29 Messages 6 Publieurs 7.5k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Mokona78M Hors-ligne
      Mokona78
      dernière édition par

      Mais qu’est-ce qui empêche les mods d’aller patcher le bytecode du Security Manager ?

      1 réponse Dernière réponse Répondre Citer 0
      • RedRelayR Hors-ligne
        RedRelay Moddeurs confirmés
        dernière édition par

        1/ Elle permet de ne pas pouvoir changer le SecurityException de façon standard et de levé une exception dès qu’une classe autre que FML ou Minecraft appelle la fonction System.exit().
        Bien que l’exception levé fasse crasher l’appli, elle permet de générer un rapport d’erreur. Ça éviter aux joueurs de signaler un bug sans crash log lorsqu’un moddeur cochon utilise System.exit() (et il y en a sur ce forum).

        2/ Mon Test Runner JUnit custom, est lancé sur Eclipse via “org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main()”. C’est cette classe qui appel System.exit() à la fin de tout les tests.
        Donc les test sont exécuté, mais j’ai un crash dans la console et j’aime pas, ça fait sale ^^

        Rien n’empêche les mods d’aller patcher le bytecode du SecurityManager, c’est d’aller ce que j’ai fais ^^
        (Mais c’est d’un bordel monstre avec les différents ClassLoader, ça fais 4 jours que je suis dessus, il y a plein de petite subtilité a savoir. C’est pas forcément compliqué, mais ce sont des choses qu’ils faut savoir ^^)

        Je n’étais pas obliger de report le bug, mais tant qu’a faire ^^
        Je doute que beaucoup de personnes ait l’occasion de dealer avec cette classe donc j’ai fais une pull request ^^
        (Je vais passer contributeur MinecraftForge, la classe 😎 😛 )

        –------------------------------------------------------------------------------------
        Si tu trouves mon intervention pertinente, n'hésite pas a m…

        1 réponse Dernière réponse Répondre Citer 0
        • SCAREXS Hors-ligne
          SCAREX
          dernière édition par

          Normalement le Security manager de fml ne peut pas être patché puisqu’il est chargé avant les plugins fml

          Site web contenant mes scripts : http://SCAREXgaming.github.io

          Pas de demandes de support par MP ni par skype SVP.
          Je n'accepte sur skype que l…

          1 réponse Dernière réponse Répondre Citer 0
          • RedRelayR Hors-ligne
            RedRelay Moddeurs confirmés
            dernière édition par

            Je n’utilise pas de coremod pour patcher le SecurityManager.
            En gros, dans le constructeur de mon TestRunner, voila ce que j’ai :

            
            public MinecraftServerJUnitRunner(Class klass) throws InitializationError {
            super(klass);
            ASMTransformer.injectCode();
            try {
            Class.forName("GradleStartServer", true, Thread.currentThread().getContextClassLoader()).getDeclaredMethod("main", String[].class).invoke(null, new Object[] { params });
            } catch (Throwable e) {
            throw new InitializationError("Unable to launch Minecraft Server : "+e.getMessage());
            }
            
            System.out.println("Waiting for Minecraft Server start …");
            /* ... */
            
            

            Donc je fais les modifications avant de lancer le jeu.
            Les classes sont bien modifié, mais je n’arrive pas a les lancer, à chaque fois je retombe sur les classes originale …
            Donc pour l’instant je cherche… pourtant j’ai créer un nouveau ClassLoader pour avoir accès a la fonction defineClass(classname, byte[], offset, length)
            Et je met ce classLoader dans Thread.currentThread().setContextClassLoader() …

            Je modifie la class GradleStartCommon pour remplacer le Class.forName(String name) par Class.forName(String name, boolean init, ClassLoader cl)
            Je modifie la class Launch pour que mettre mon CustomClassLoader en parent du nouveau ClassLoader et lui ajouter une classLoaderExcusion
            Je modifie la class FMLSecurityManager en supprimant toutes les instructions dans checkPermission()

            Ça a marché une fois il me semble, alors j’ai factorisé mon code pour que se soit plus propre et la ça ne fonctionne plus …
            Je m’en tire les cheveux ><

            –------------------------------------------------------------------------------------
            Si tu trouves mon intervention pertinente, n'hésite pas a m…

            1 réponse Dernière réponse Répondre Citer 0
            • Mokona78M Hors-ligne
              Mokona78
              dernière édition par

              @‘Blackout’:

              Je n’étais pas obliger de report le bug, mais tant qu’a faire ^^
              Je doute que beaucoup de personnes ait l’occasion de dealer avec cette classe donc j’ai fais une pull request ^^

              C’est la bonne attitude !

              Merci pour les précisions.

              1 réponse Dernière réponse Répondre Citer 0
              • RedRelayR Hors-ligne
                RedRelay Moddeurs confirmés
                dernière édition par

                @‘Mokona78’:

                @‘Blackout’:

                Je n’étais pas obliger de report le bug, mais tant qu’a faire ^^
                Je doute que beaucoup de personnes ait l’occasion de dealer avec cette classe donc j’ai fais une pull request ^^

                C’est la bonne attitude !

                Merci pour les précisions.

                Parfois je me le demande, ma pull request a été refuser avec le message :
                @‘cpw’:

                [font=-apple-system, BlinkMacSystemFont,No error log? I’ve never seen this happen. Hypothetical fixes are not accepted.]

                J’hallucine …

                –------------------------------------------------------------------------------------
                Si tu trouves mon intervention pertinente, n'hésite pas a m…

                1 réponse Dernière réponse Répondre Citer 0
                • SCAREXS Hors-ligne
                  SCAREX
                  dernière édition par

                  Ce que tu peux faire à la place c’est de re-créer le FMLSecurityManager et de charger le bytecode depuis un autre fichier

                  Site web contenant mes scripts : http://SCAREXgaming.github.io

                  Pas de demandes de support par MP ni par skype SVP.
                  Je n'accepte sur skype que l…

                  1 réponse Dernière réponse Répondre Citer 0
                  • Mokona78M Hors-ligne
                    Mokona78
                    dernière édition par

                    @‘Blackout’:

                    @‘Mokona78’:

                    @‘Blackout’:

                    Je n’étais pas obliger de report le bug, mais tant qu’a faire ^^
                    Je doute que beaucoup de personnes ait l’occasion de dealer avec cette classe donc j’ai fais une pull request ^^

                    C’est la bonne attitude !

                    Merci pour les précisions.

                    Parfois je me le demande, ma pull request a été refuser avec le message :
                    @‘cpw’:

                    [font=-apple-system, BlinkMacSystemFont,No error log? I’ve never seen this happen. Hypothetical fixes are not accepted.]

                    J’hallucine …

                    C’est celui qui a refusé qui n’a pas la bonne attitude…

                    1 réponse Dernière réponse Répondre Citer 0
                    • Superloup10S Hors-ligne
                      Superloup10 Modérateurs
                      dernière édition par

                      cpw est quand même plus sympa avec les pull request que Lex, en revanche, les tests unitaires ne sont pas considérés comme une utilisation normale de FML et de Forge d’où le rejet.

                      Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                      1 réponse Dernière réponse Répondre Citer 0
                      • Mokona78M Hors-ligne
                        Mokona78
                        dernière édition par

                        Mais là, il y a une erreur non ? Elle n’est pas bien complexe à reproduire j’imagine. Il suffit d’appeler la fonction dans un contexte avec une pile moins profonde que 5 niveaux.

                        À moins que ce soit impossible ?

                        1 réponse Dernière réponse Répondre Citer 0
                        • Superloup10S Hors-ligne
                          Superloup10 Modérateurs
                          dernière édition par

                          Si c’est une erreur très grave, il y a de forte chance que d’autres moddeurs aient eu le même souci, personnellement, j’ai beau avoir relue une bonne dizaine de fois le code qu’à donné Blackout, je ne vois toujours pas où est le problème.

                          Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                          Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                          1 réponse Dernière réponse Répondre Citer 0
                          • Mokona78M Hors-ligne
                            Mokona78
                            dernière édition par

                            Si getClassContext(); renvoie un tableau de 4 ou 5 éléments ?

                            1 réponse Dernière réponse Répondre Citer 0
                            • Superloup10S Hors-ligne
                              Superloup10 Modérateurs
                              dernière édition par

                              Aucune idée, je ne sais pas ce que renvoie ce getter, un tableau de class, mais lesquelles ?

                              Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                              Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                              1 réponse Dernière réponse Répondre Citer 0
                              • Mokona78M Hors-ligne
                                Mokona78
                                dernière édition par

                                Ça renvoie la callstack. Ce sont les différentes appels qui ont amenés à l’appel courant.

                                Mais peu importe:

                                • un tableau de taille 4 (>3) auquel on accède à l’élément d’indice 4, ça fait IndexOutOfBoundsException.
                                • un tableau de taille 5 (>4) auquel on accède à l’élément d’indice 5, ça fait pas mieux, pas pire.

                                Le test n’est pas cohérent avec l’appel qui suit.

                                Après, peut-être qu’il y a une règle qui dit que si le tableau renvoyé est assuré d’avoir une taille 4 alors il a une taille 5. Et s’il a une taille 5 il est assuré d’avoir une taille 6… J’y crois assez peu.

                                1 réponse Dernière réponse Répondre Citer 0
                                • robin4002R Hors-ligne
                                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                  dernière édition par

                                  http://www.minecraftforge.net/forum/index.php/topic,40907.msg215989.html#msg215989
                                  “So anyway, I have to completly bypass the security manager using ASM.”
                                  Retires cette phrase avant que lex ne la voit, sinon tu vas encore plus te faire allumer x)
                                  Lex n’aime pas du tout les “comme vous n’acceptez pas mon correctif / ma fonctionnalité je vais tout hacker de mon côté avec de l’ASM”.

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • Mokona78M Hors-ligne
                                    Mokona78
                                    dernière édition par

                                    C’est pour un test runner, pas pour distribuer dans un mod. Je ne vois pas pourquoi il ne pourrait pas le faire.

                                    De plus, il ajoute le crash log demandé qui montre bien que le problème est réel et pas hypothétique.

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • Superloup10S Hors-ligne
                                      Superloup10 Modérateurs
                                      dernière édition par

                                      cpw a fini par merge le pull request. (voir https://github.com/MinecraftForge/MinecraftForge/pull/3125#issuecomment-236043532 )

                                      Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • RedRelayR Hors-ligne
                                        RedRelay Moddeurs confirmés
                                        dernière édition par

                                        @‘robin4002’:

                                        http://www.minecraftforge.net/forum/index.php/topic,40907.msg215989.html#msg215989
                                        “So anyway, I have to completly bypass the security manager using ASM.”
                                        Retires cette phrase avant que lex ne la voit, sinon tu vas encore plus te faire allumer x)
                                        Lex n’aime pas du tout les “comme vous n’acceptez pas mon correctif / ma fonctionnalité je vais tout hacker de mon côté avec de l’ASM”.

                                        Non non, ce n’est pas du tout ça dont il est question x)
                                        Indépendamment de ma volonté, je fais un System.exit() et ce n’est pas autorisé par le SecurityManager.
                                        Donc la, bug ou pas, je dois bypass ^^
                                        Mais ce n’est pas pour un mod, donc aucun soucis incompatibilité ^^

                                        –------------------------------------------------------------------------------------
                                        Si tu trouves mon intervention pertinente, n'hésite pas a m…

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • Mokona78M Hors-ligne
                                          Mokona78
                                          dernière édition par

                                          @‘Superloup10’:

                                          cpw a fini par merge le pull request. (voir https://github.com/MinecraftForge/MinecraftForge/pull/3125#issuecomment-236043532 )

                                          Ah ! Bien.

                                          À noter que sa remarque sur le fait que cette classe s’active pendant une session de test est peut-être à revoir.

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • RedRelayR Hors-ligne
                                            RedRelay Moddeurs confirmés
                                            dernière édition par

                                            Bah c’est juste un System.exit() appelé par une classes externe au mod et à ses tests qui fait qu’on arrive dans cette fonction.
                                            Je lance le jeu comme si c’était le launcher qui le lancé pour ne pas avoir a faire un new WorldServeur() manuellement par exemple et donc éviter d’avec un environnement de test différent de celui de production.
                                            Mais oui, je suis d’accord que dans l’ideal, je n’ai pas a modifier le FMLSecurityManager, mais un mod n’a pas a appeler System.exit() ^^

                                            –------------------------------------------------------------------------------------
                                            Si tu trouves mon intervention pertinente, n'hésite pas a m…

                                            1 réponse Dernière réponse Répondre Citer 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            ContactMentions Légales

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB