Jailbreak iphone 4G

Le nouveau Jailbreak proposé par JailbreakMe pour jaibreaker l'iPhone 4G se base une nouvelle fois sur une faille de Safari (Webkit ?) pour installer Cydia en douce.

http://www.jailbreakme.com

Quand on regarde de plus prêt le code Javascript de la page, on y découvre une fabuleuse et incroyable fonction getSunSpiderInterval que même Einstein aurait eu du mal à coder et qui remet en question la sécurité du browsing sur Internet depuis un iphone / ipad / ipod ...

function getSunSpiderInterval() {
    if (_sunSpiderInterval) {
        return _sunSpiderInterval
    }
    var d = new Date,
        g = [],
        r = [],
        m = [],
        l = [],
        v = {},
        x = {},
        t, p = {};
    p.Width = 300;
    p.Height = 300;

    function n(L, J) {
        var I = L.V[0],
            K = J.V[0],
            H = L.V[1],
            G = J.V[1],
            F = Math.abs(K - I),
            E = Math.abs(G - H),
            A = I,
            i = H,
            C, D, B;
        if (K >= I) {
            K = I = 1
        } else {
            K = I = -1
        }
        if (G >= H) {
            G = H = 1
        } else {
            G = H = -1
        }
        if (F >= E) {
            G = I = 0;
            C = F;
            D = F / 2;
            B = E;
            F = F
        } else {
            H = K = 0;
            C = E;
            D = E / 2;
            B = F;
            F = E
        }
        F = Math.round(g.LastPx + F);
        for (E = g.LastPx; E < F; E++) {
            D += B;
            if (D >= C) {
                D -= C;
                A += I;
                i += H
            }
            A += K;
            i += G
        }
        g.LastPx = F
    }
    function q(i, B) {
        var A = [];
        A[0] = i[1] * B[2] - i[2] * B[1];
        A[1] = i[2] * B[0] - i[0] * B[2];
        A[2] = i[0] * B[1] - i[1] * B[0];
        return A
    }
    function b(A, E, D) {
        for (var i = [], C = [], B = 0; B < 3; B++) {
            i[B] = A[B] - E[B];
            C[B] = D[B] - E[B]
        }
        i = q(i, C);
        A = Math.sqrt(i[0] * i[0] + i[1] * i[1] + i[2] * i[2]);
        for (B = 0; B < 3; B++) {
            i[B] /= A
        }
        i[3] = 1;
        return i
    }
    function f(i, B, A) {
        this.V = [i, B, A, 1]
    }
    function e(A, D) {
        for (var C = [
            [],
            [],
            [],
            []
        ], i = 0, B = 0; i < 4; i++) {
            for (B = 0; B < 4; B++) {
                C[i][B] = A[i][0] * D[0][B] + A[i][1] * D[1][B] + A[i][2] * D[2][B] + A[i][3] * D[3][B]
            }
        }
        return C
    }
    function j(A, C) {
        for (var B = [], i = 0; i < 4; i++) {
            B[i] = A[i][0] * C[0] + A[i][1] * C[1] + A[i][2] * C[2] + A[i][3] * C[3]
        }
        return B
    }
    function k(A, C) {
        for (var B = [], i = 0; i < 3; i++) {
            B[i] = A[i][0] * C[0] + A[i][1] * C[1] + A[i][2] * C[2]
        }
        return B
    }
    function h(A, D) {
        for (var C = [
            [],
            [],
            [],
            []
        ], i = 0, B = 0; i < 4; i++) {
            for (B = 0; B < 4; B++) {
                C[i][B] = A[i][B] + D[i][B]
            }
        }
        return C
    }
    function o(A, C, B, i) {
        return e([
            [1, 0, 0, C],
            [0, 1, 0, B],
            [0, 0, 1, i],
            [0, 0, 0, 1]
        ], A)
    }
    function a(A, C) {
        var B = C;
        B *= Math.PI / 180;
        var i = Math.cos(B);
        B = Math.sin(B);
        return e([
            [1, 0, 0, 0],
            [0, i, -B, 0],
            [0, B, i, 0],
            [0, 0, 0, 1]
        ], A)
    }
    function z(A, C) {
        var B = C;
        B *= Math.PI / 180;
        var i = Math.cos(B);
        B = Math.sin(B);
        return e([
            [i, 0, B, 0],
            [0, 1, 0, 0],
            [-B, 0, i, 0],
            [0, 0, 0, 1]
        ], A)
    }
    function w(A, C) {
        var B = C;
        B *= Math.PI / 180;
        var i = Math.cos(B);
        B = Math.sin(B);
        return e([
            [i, -B, 0, 0],
            [B, i, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ], A)
    }
    function u() {
        var i = [],
            A = 5;
        for (g.LastPx = 0; A > -1; A--) {
            i[A] = k(m, g.Normal[A])
        }
        if (i[0][2] < 0) {
            if (!g.Line[0]) {
                n(g[0], g[1]);
                g.Line[0] = true
            }
            if (!g.Line[1]) {
                n(g[1], g[2]);
                g.Line[1] = true
            }
            if (!g.Line[2]) {
                n(g[2], g[3]);
                g.Line[2] = true
            }
            if (!g.Line[3]) {
                n(g[3], g[0]);
                g.Line[3] = true
            }
        }
        if (i[1][2] < 0) {
            if (!g.Line[2]) {
                n(g[3], g[2]);
                g.Line[2] = true
            }
            if (!g.Line[9]) {
                n(g[2], g[6]);
                g.Line[9] = true
            }
            if (!g.Line[6]) {
                n(g[6], g[7]);
                g.Line[6] = true
            }
            if (!g.Line[10]) {
                n(g[7], g[3]);
                g.Line[10] = true
            }
        }
        if (i[2][2] < 0) {
            if (!g.Line[4]) {
                n(g[4], g[5]);
                g.Line[4] = true
            }
            if (!g.Line[5]) {
                n(g[5], g[6]);
                g.Line[5] = true
            }
            if (!g.Line[6]) {
                n(g[6], g[7]);
                g.Line[6] = true
            }
            if (!g.Line[7]) {
                n(g[7], g[4]);
                g.Line[7] = true
            }
        }
        if (i[3][2] < 0) {
            if (!g.Line[4]) {
                n(g[4], g[5]);
                g.Line[4] = true
            }
            if (!g.Line[8]) {
                n(g[5], g[1]);
                g.Line[8] = true
            }
            if (!g.Line[0]) {
                n(g[1], g[0]);
                g.Line[0] = true
            }
            if (!g.Line[11]) {
                n(g[0], g[4]);
                g.Line[11] = true
            }
        }
        if (i[4][2] < 0) {
            if (!g.Line[11]) {
                n(g[4], g[0]);
                g.Line[11] = true
            }
            if (!g.Line[3]) {
                n(g[0], g[3]);
                g.Line[3] = true
            }
            if (!g.Line[10]) {
                n(g[3], g[7]);
                g.Line[10] = true
            }
            if (!g.Line[7]) {
                n(g[7], g[4]);
                g.Line[7] = true
            }
        }
        if (i[5][2] < 0) {
            if (!g.Line[8]) {
                n(g[1], g[5]);
                g.Line[8] = true
            }
            if (!g.Line[5]) {
                n(g[5], g[6]);
                g.Line[5] = true
            }
            if (!g.Line[9]) {
                n(g[6], g[2]);
                g.Line[9] = true
            }
            if (!g.Line[1]) {
                n(g[2], g[1]);
                g.Line[1] = true
            }
        }
        g.Line = [false, false, false, false, false, false, false, false, false, false, false, false];
        g.LastPx = 0
    }
    function c() {
        if (!(x.LoopCount > x.LoopMax)) {
            for (var i = String(x.LoopCount); i.length < 3;) {
                i = "0" + i
            }
            r = o(l, -g[8].V[0], -g[8].V[1], -g[8].V[2]);
            r = a(r, 1);
            r = z(r, 3);
            r = w(r, 5);
            r = o(r, g[8].V[0], g[8].V[1], g[8].V[2]);
            m = e(r, m);
            for (i = 8; i > -1; i--) {
                g[i].V = j(r, g[i].V)
            }
            u();
            x.LoopCount++;
            c()
        }
    }
    function y(i) {
        v.V = [150, 150, 20, 1];
        x.LoopCount = 0;
        x.LoopMax = 50;
        x.TimeMax = 0;
        x.TimeAvg = 0;
        x.TimeMin = 0;
        x.TimeTemp = 0;
        x.TimeTotal = 0;
        x.Init = false;
        r = [
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ];
        m = [
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ];
        l = [
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ];
        g[0] = new f(-i, -i, i);
        g[1] = new f(-i, i, i);
        g[2] = new f(i, i, i);
        g[3] = new f(i, -i, i);
        g[4] = new f(-i, -i, -i);
        g[5] = new f(-i, i, -i);
        g[6] = new f(i, i, -i);
        g[7] = new f(i, -i, -i);
        g[8] = new f(0, 0, 0);
        g.Edge = [
            [0, 1, 2],
            [3, 2, 6],
            [7, 6, 5],
            [4, 5, 1],
            [4, 0, 3],
            [1, 5, 6]
        ];
        g.Normal = [];
        for (var A = 0; A < g.Edge.length; A++) {
            g.Normal[A] = b(g[g.Edge[A][0]].V, g[g.Edge[A][1]].V, g[g.Edge[A][2]].V)
        }
        g.Line = [false, false, false, false, false, false, false, false, false, false, false, false];
        g.NumPx = 18 * i;
        for (A = 0; A < g.NumPx; A++) {
            f(0, 0, 0)
        }
        r = o(r, v.V[0], v.V[1], v.V[2]);
        m = e(r, m);
        for (A = 0; A < 9; A++) {
            g[A].V = j(r, g[A].V)
        }
        u();
        x.Init = true;
        c()
    }
    for (var s = 20; s <= 160; s *= 2) {
        y(s)
    }
    p = LoopTime = x = v = l = m = r = g = null;
    return _sunSpiderInterval = new Date - d
};
/

Le code source complet du Jailbreak se situe ici : http://pastebin.com/pmQqsR2Y

Si l'un de vous est assez fou pour découvrir ce que fait exactement la fonction, n'hésitez pas à poster un commentaire ;-) Cette fonction est à mon avis la cause de la nouvelle faille exploitée par JailBreakMe.

Update : en fait la faille se situe au niveau de l'interprétation des PDF (Voir : http://www.jailbreakme.com/_/), cependant cette fonction doit jouer un rôle important dans le Jailbreak ... mais lequel ? ;-)

En attendant la correction du problème de sécurité par Apple, ne trainez pas trop sur des sites de warez / X ....

Happy Jailbreak !

Toute la toile parle du Jailbreak iphone 4G

1. Le , 01:09 par Neuromancien
820794a0f2038d88920a2648c29ad76a

Dépassement de tampon...
Copier coller dans un bon éditeur de texte+mettage des tabulations et des saut de lines et on devrais y voir plus clair...

2. Le , 09:17 par Yoann
0a7b6ef35915b6ed25aacecd74dcfbd5

et non, ce n'est pas ce code là qui jailbreak... c'est une partie du code permettant de détecter la version de l'iphone, le jailbreak utilise une faille dans la prise en charge des pdf, tout se passe dans la fonction jailbreak_real qui crée une iframe contenant un pdf dont l'url dépend du modèle à jailbreaker.

je collerais bien la source indentée mais je ne sais pas si ça passerait joliment dans les commentaires...

3. Le , 15:56 par Ingnu
a0c02e50cad289172703d3f92c60bc2a

http://pastebin.com/pmQqsR2Y

Ca doit être ça que vous cherchez :)

4. Le , 21:06 par Bu2
450f83a79fd26f01220fc8f7a1e62404

Je pense que ce document explique bien le hic :
https://lirias.kuleuven.be/bitstrea...

!!! Attention, c'est peut être un pdf malicieux !!!

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.