Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierFlux principal

GTFOBins - 478 binaires Unix qui font tomber root

Par : Korben ✨
28 avril 2026 à 12:28

478 binaires Unix peuvent servir à devenir root sur un système mal configuré.

C'est ce que recense GTFOBins , le projet open source monté par Emilio Pinna et Andrea Cardaci, qui est devenu LE bookmark obligatoire de tout pentester Linux.

Ce ne sont pas des exploits, hein, mais juste des fonctions parfaitement légitimes de programmes installés partout, et qui dans le bon contexte (genre un bit SUID oublié, qui fait tourner un binaire avec les droits du propriétaire, souvent root) permettent de spawner un shell, lire un fichier protégé, ou grimper d'un cran dans la hiérarchie des privilèges. Petit rappel quand même, faut déjà avoir un pied sur la machine, ce n'est pas une porte d'entrée magique depuis Internet.

Une fois sur leur site, vous tapez le nom d'un binaire dans le moteur de filtre (ou vous cliquez sur une fonction), et hop, vous tombez sur les commandes exactes à recopier-coller, et c'est plié en moins de dix secondes.

Par exemple, si votre cible a un sudo find sans mot de passe, le site vous donne sur un plateau d'argent sudo find . -exec /bin/sh \; -quit.

Un mawk qui tourne en SUID root ? Direct, mawk 'BEGIN {system("/bin/sh")}' et bonjour le shell privilégié. Un vim mal configuré (compilé avec le support Python ou Lua, ce qui est le cas dans la plupart des distros desktop) ? La page documente comment l'utiliser via :py ou :lua pour exécuter du code arbitraire et retomber sur ses pattes.

C'est donc la fin des recherches désespérées sur StackOverflow à 3h du matin pendant un CTF...

La philosophie de ce projet est claire... on ne casse rien, on détourne juste l'usage prévu. Le hic, c'est que la frontière entre détournement et exploitation est mince quand un sudoers mal écrit donne accès à un binaire trop puissant.

Les 478 binaires sont rangés selon 11 fonctions et 4 contextes d'exécution. Côté fonctions, vous avez : Shell (228 binaires permettent de spawner un shell, oui presque la moitié du catalogue), File-read (199), File-write (84), Inherit (71), Upload (34), Download (32), Command (30), Reverse-shell (21), Privilege-escalation (14), Library-load (11), et Bind-shell (7). Côté contextes : Unprivileged, Sudo, SUID, et Capabilities.

Et sur la page d'un binaire, chaque case du tableau vous dit super clairement "voilà comment t'en sors selon ce que tu as sous la main".

Les champions toutes catégories ce sont les langages interprétés et les shells eux-mêmes. zsh, socat, ruby, python, php, node, lua plus bash, tous cumulent 7 fonctions différentes chacun. C'est logique, dès que vous avez un interpréteur sous la main vous pouvez faire à peu près tout (lire, écrire, exécuter, ouvrir une socket).

D'ailleurs c'est pour ça que les sysadmins paranoïaques tirent une tête bizarre quand on leur dit qu'on a installé Python sur un serveur de prod sans cas d'usage explicite. Pfff... je les comprends, un Python qui traîne sur un serveur Debian avec un sudo NOPASSWD au-dessus, c'est game over en trois lignes.

Y'a un autre détail que je trouve cool également, c'est l'intégration MITRE ATT&CK . Chaque fonction du site est mappée à une technique du framework officiel, accessible via /mitre.json.

Donc pour les blue teams qui veulent justifier une règle de détection en réunion, c'est tout simplement cadeau !! Et pour ceux qui automatisent leurs scans, l'API JSON complète est dispo sur /api.json, du coup vous pouvez parser les 478 entrées avec un jq ou un petit script Python pour générer des règles de monitoring custom.

Bref, GTFOBins c'est aussi un cadeau pour les défenseurs, à condition de retourner la logique du projet. Voilà, ça vaut le coup d'y passer dix minutes par mois sur un audit.

Pour les Windowsiens qui se sentent oubliés, sachez que l'équivalent existe et s'appelle LOLBAS (Living Off The Land Binaries And Scripts), bien suivi par les analystes Windows depuis 2018. Même philosophie, même format, même utilité, juste appliqué aux exécutables Microsoft signés que Windows installe par défaut.

Les deux projets se citent mutuellement et forment ensemble la cartographie communautaire des techniques de Living Off The Land cross-OS. Si vous bossez sur les deux côtés du fossé, gardez les deux onglets ouverts en permanence ^^ !

Maintenant si l'angle élévation de privilèges via shell restreint vous intéresse, j'avais déjà couvert une vieille faille sudo qui permettait carrément de sortir d'un chroot , et plus largement la bibliothèque Payloads All The Things qui complète bien GTFOBins sur tout ce qui est exploitation web et post-exploitation. Les deux projets sont complémentaires, GTFOBins se concentre sur les binaires Unix et les abus locaux de fonctionnalités légitimes (shells, transferts, lectures, élévation conditionnelle), PayloadsAllTheThings ratisse plus large côté exploitation web.

Côté admin, le réflexe utile, à vrai dire c'est de lister vos binaires SUID avec find / -perm -4000 -type f 2>/dev/null, vérifier /etc/sudoers plus les fichiers /etc/sudoers.d/* avec sudo -l, puis de passer chaque candidat dans le filtre GTFOBins.

Si une entrée matche, c'est qu'il y a une fuite potentielle à boucher. Attention quand même, l'absence dans GTFOBins ne valide pas une règle sudo ou un SUID custom (wildcards, variables d'env, paths inscriptibles peuvent toujours créer un chemin d'évasion). Bref, c'est à faire avant de filer le moindre sudo NOPASSWD à quelqu'un !

Un loup s'échappe en Corée du Sud, et l'IA vient mettre le bordel dans sa capture

25 avril 2026 à 10:45

Voici l'histoire de Neukgu, un loup coréen de deux ans qui s'est fait la malle d'un zoo de Daejeon le 8 avril dernier, et qui a tenu en haleine toute la Corée du Sud pendant neuf jours.

Sauf que dans la foulée de l'évasion, un homme de 40 ans génère une fausse photo IA du loup en train de traverser un carrefour, la diffuse en ligne, et l'image finit par remonter jusqu'aux autorités qui n'y voient que du feu.

La séquence qui suit est assez improbable. La municipalité de Daejeon envoie une alerte d'urgence par SMS à la population, signalant un loup au niveau du carrefour en question. Les autorités présentent même l'image en conférence de presse officielle sur l'évasion.

Toute l'opération de recherche se déplace vers cette zone, alors que le vrai loup est très probablement ailleurs. Bref, des centaines d'agents lancés sur une fausse trace générée pour rigoler.

Pendant ce temps, Neukgu continue sa balade. Il sera finalement attrapé près d'une voie rapide neuf jours après l'évasion, sain et sauf.

La police, elle, remonte jusqu'au générateur d'images en croisant la vidéosurveillance et les logs d'utilisation des plateformes IA. Le suspect, 40 ans, raconte avoir fait ça "pour s'amuser".

Moyen rigolo du coup. Il est désormais poursuivi pour entrave au travail des autorités par tromperie, un délit qui peut coûter jusqu'à 5 ans de prison ou environ 7000 euros d'amende.

Côté postérité, Neukgu est devenu une star locale. Issu d'un programme de réintroduction du loup coréen (officiellement éteint à l'état sauvage), il a eu droit à des viennoiseries à son effigie dans une boulangerie du coin, plus d'un million de vues sur la vidéo de son retour, et la ville réfléchit même à le nommer mascotte officielle. Le président Lee Jae Myung avait publiquement prié pour son retour. Sympathique épilogue.

L'affaire pose quand même une vraie question sur l'authentification des images dans des contextes où elles deviennent opérationnelles. Quand une image IA arrive jusqu'à un SMS d'alerte gouvernemental, le filtre humain a clairement raté un étage, même si ça va devenir de plus en plus compliqué avec le temps.

Bref, premier cas vraiment grand public où une fausse photo IA détourne une opération policière, avec poursuites à la clé. Et ça ne sera pas le dernier.

Source : BBC

Flipbook - Le web où chaque page est une image IA

Par : Korben ✨
23 avril 2026 à 09:03

Flipbook est un navigateur web génératif où aucune page n'existe avant que vous ne la demandiez. Pas de HTML, pas de boutons, pas de liens... A la place, vous tapez simplement un mot ou un sujet dans la barre de recherche (ou vous uploadez une image), et hop, ça vous pond une image en direct façon "infographie" qui explique ce sujet.

Ensuite, vous cliquez n'importe où sur cette image, et une nouvelle image apparaît qui creuse ce que vous venez de cliquer. En gros, faut imaginer Wikipedia mais avec aucun article pré-écrit puisque chaque page est dessinée par une IA pendant que vous patientez. C'est un genre d'Infinite Wiki en version 100% visuelle !

La page que Flipbook m'a sortie quand j'ai tapé mon nom. Tout ce que vous voyez est une seule image générée par le modèle, y compris le texte.

Perso, j'ai juste tapé mon pseudonyme ce matin pour tester et comme résultat, j'ai obtenu une page intitulée "Korben: The French Tech Influence", avec mon vrai nom Manuel Dorne, le lancement de korben.info noté en 2004, RemixJobs cité et même cette citation : "A cornerstone of the French-speaking web for over two decades" écrit en bas.

Ne vous inquiétez pas pour mes chevilles, c'est pas moi qui le dit mais l'IA qui a chopé ces infos très précises et pour la majorité exacte. Le système de Flipbook fait une vraie recherche web agentique, et pas juste de l'hallucination pure à partir de son modèle. Les créateurs l'expliquent d'ailleurs dans leur FAQ.

Ensuite, il suffit de cliquer sur des éléments de l'image pour qu'une nouvelle image soit générée avec d'autres informations plus précises selon ce sur quoi vous avez cliqué.

Mais le détail qui tue, c'est que TOUT le texte affiché à l'écran est rendu par le modèle d'image lui-même ! Aucune superposition HTML, aucun overlay texte. Les titres, les labels, les légendes, les flèches... tout est dessiné pixel par pixel au moment de la génération, comme si Photoshop crachait une infographie complète à chaque requête.

Le hic c'est que parfois ça bug (le modèle écrit un mot au mauvais endroit, ou fait une petite faute de frappe), mais c'est le choix assumé de l'équipe, qui ne souhaite aucune couche de rendu HTML classique. Sous le capot en fait, y'a LTX Studio (le modèle vidéo de Lightricks) qui anime les transitions en stream vidéo live, et Modal Labs pour l'infra GPU serverless qui encaisse la charge.

Après comme d'hab avec ce genre d'outils c'est que les hallucinations factuelles sont invisibles pour l'utilisateur, puisqu'il n'y a pas de source citée, ni de lien à cliquer pour vérifier.

Et Zain Shah, l'un des créateurs, l'admet lui-même dans son thread de lancement sur X, Flipbook est aujourd'hui limité aux explications visuelles. Donc pas forcément adapté pour du vrai mode interactif (coder, réserver un truc, stocker de la data). Il faudra donc attendre que les modèles d'image et de vidéo deviennent plus rapides, plus précis, et surtout capables de conserver leur état pour assurer une cohérence dans le contenu (texte et images).

Bref, ça vaut le coup de tester , tapez votre nom ou votre animal préféré et voyez ce qui en sort !

Source

Flow Music - L'IA musicale de Google débarque avec Lyria 3

Par : Korben ✨
21 avril 2026 à 14:09

Ça y est les amis, comme à Fraggle Rock, Google entre enfin dans la danse de la musique IA avec Flow Music . Son service vient de sortir en freemium, et c'est la réponse officielle de Mountain View à Suno et Udio . Et derrière le volant, on retrouve Lyria 3, le modèle de DeepMind spécialisé dans la génération musicale.

Une fois sur le site, c'est du classique. Vous tapez un prompt du genre "lofi beat pour vibe coder la nuit", ensuite vous cliquez sur le bouton, et pouf quelques secondes après, l'IA vous pond un morceau complet avec vocaux dynamiques et arrangement d'une qualité foooollllle ! Et celui-ci peut aller jusqu'à 3 minutes en passant par le modèle Lyria 3 Pro. Après, rien d'inédit côté concept, car y'a déjà Suno depuis 2023 et Udio depuis 2024 qui font ça. Sauf que Google a empilé pas mal de features pour se démarquer et pas des moindres, vous allez voir !

D'abord leurs machin baptisé Spaces, c'est le truc qui m'a fait lever un premier sourcil. En fait, au lieu de taper un simple prompt, vous pouvez vibe-coder votre propre outil : un clavier virtuel, un mini-jeu musical, un DAW maison. Vous décrivez ce que vous voulez, puis l'IA génère l'interface, et ensuite vous jouez avec. Sur la homepage, ils montrent par exemple un piano miniature jouable à la souris, genre prototype fait en moins de 10 minutes. En fait l'idée, c'est que chacun se bricole son interface. Suno et Udio ont chacun leur panoplie d'outils plus avancés (mode studio, édition timeline, inpainting), mais l'approche Spaces, clairement, personne d'autre ne la propose pour l'instant !

Autre truc pratique, l'articulation avec Veo, le modèle vidéo maison de Google. En gros, Veo génère directement image et audio de son côté, et Lyria 3 sert de moteur musical dédié quand vous préférez gérer séparément votre bande-son. Pratique pour les créateurs YouTube qui veulent produire vite sans sortir leur caméra. D'ailleurs, Google Vids (l'éditeur vidéo de Workspace) intègre Lyria 3 pour la musique et Veo pour la vidéo, donc les deux univers se parlent déjà.

Côté features plus traditionnelles, vous avez le remix, les effets audio, la séparation des stems pour isoler les pistes, et des crédits journaliers pour la formule gratuite histoire de vous amuser. L'outil apprend aussi votre style au fil des usages, genre playlist Spotify mais en version génération (bonjour la bulle algorithmique).

Le hic qui va faire râler par contre c'est le marquage SynthID d'office. Google pose un watermark imperceptible sur tous les morceaux générés, un peu comme un tampon encreur invisible. L'idée, c'est d'identifier les contenus produits par l'IA Google, sans forcément d'empêcher les usages pénibles.

Côté voix, Suno propose un système de voice profile encadré avec vérification des droits et Flow Music n'a pour le moment aucune fonction équivalente officielle. Et ça ne propose que 3 minutes max par morceau alors que Suno peut monter à 8 minutes. Je pense donc que les musiciens IA "pros" resteront chez les concurrents. Mais c'est pas la même cible alors ça ne me choque pas. Flow Music vise plutôt les créateurs de contenu qui veulent se faire une BO rapide !

Dernier détail, les droits commerciaux restent flous sur la version gratuite. À vous donc de vérifier ça dans les conditions d'utilisation avant de coller votre nouveau morceau dans une vidéo monétisée. Côté dataset d'entraînement, Google dit s'appuyer sur des contenus qu'il estime pouvoir exploiter via ses CGU YouTube et ses accords partenaires sauf que des artistes indépendants ont porté plainte en mars 2026 en contestant cette lecture, donc l'histoire n'est pas encore tranchée.

On verra bien, mais en attendant, c'est gratuit, dispo sans carte bancaire, et en deux clics c'est parti pour que vous commenciez à rêver d'une Victoire de la Musique. Moi de mon côté, je vais aller creuser les Spaces, c'est là que Flow Music se démarque vraiment. J'ai même fait une guitare en spaghetti, ma créativité est tellement sous cotée ^^!

TRELLIS-Mac - L'image-to-3D de Microsoft passe sur Apple Silicon

Par : Korben ✨
21 avril 2026 à 09:30

TRELLIS est un modèle IA capable, à partir d'un texte ou d'une image tout ce qu'il y a de plus normal, de générer un modèle en 3D. C'est développé par Microsoft Research et c'est assez génial. D'ailleurs j'en avait parlé en février dernier quand la bête ne tournait encore que sur des cartes NVIDIA.

Sauf que voilà, ça ne fonctionnait pas sur Apple Silicon, mais uniquement sur les machines compatibles CUDA. Enfin, jusqu'à aujourd'hui, puisque grâce au développeur Shivam Kumar, on dispose maintenant d'un portage pour les architectures Apple via PyTorch MPS.

Pour que ça passe côté Metal, Shivam a dû identifier les opérations CUDA qui bloquaient, puis les remplacer une par une. Comptez environ 3 minutes et demie sur un M4 Pro pour générer un mesh depuis une image. Le temps d'aller se chercher un café et de revenir, quoi.

Il vous faudra un Mac Apple Silicon avec au moins 24 Go de mémoire unifiée, et 15 Go de stockage pour les poids du modèle (soit à peu près la taille d'un gros jeu AAA). L'installation passe par un setup.sh fourni dans le repo, mais il faut d'abord un compte HuggingFace validé pour accéder aux dépendances.

En sortie, vous obtenez alors un mesh de 400 000 vertex et plus, exportable en OBJ ou GLB, donc utilisable directement dans Blender, un moteur de jeu ou votre slicer d'impression 3D. Une subtilité à retenir quand même, la version Mac se limite pour l'instant à l'image-to-3D, le text-to-3D du modèle original n'est pas encore connecté. Et les couleurs arrivent sous forme de vertex colors, pas de texture maps à l'ancienne. Perso, j'aurais préféré avoir les textures, mais bon, c'est déjà énorme d'avoir le pipeline qui tourne sans GPU NVIDIA.

Côté usages concrets, ça dépanne bien pour mocker des assets en prototypage, générer un proxy 3D à partir d'une photo pour tester un éclairage, ou poser rapidement une base éditable dans Blender. Y'a aussi Meshy 6 et Hunyuan de Tencent dans la catégorie image-to-3D si TRELLIS-Mac demande trop à votre machine.

Si ça vous intéresse, ce portage est sur GitHub en licence MIT. Si vous avez un Mac qui tient la charge, franchement ça vaut le coup de tester.

Apple a menacé de virer Grok de l'App Store à cause des deepfakes publiés sur X

Par : Korben
15 avril 2026 à 09:38

Une lettre d'Apple adressée à des sénateurs américains, obtenue par NBC News, révèle qu'Apple a menacé xAI en janvier de retirer Grok de l'App Store si l'entreprise ne bloquait pas sérieusement la génération de deepfakes sexualisés.

La menace est restée relativement discrète à l'époque, mais le dossier remonte aujourd'hui dans le cadre d'une réponse écrite à des questions parlementaires.

L'affaire a en fait démarré fin décembre 2025, quand Grok a commencé à être utilisé massivement sur X pour "dénuder" numériquement des photos de femmes, sans leur consentement, avec des résultats por#ographiques.

Apple a bougé en interne. L'entreprise a contacté les équipes X et Grok, constaté les violations de ses guidelines, et exigé un plan d'amélioration de la modération. X a "substantiellement résolu" ses violations selon Apple. Grok, pas assez.

Apple a rejeté une soumission suivante de l'app, avec notification officielle que le statu quo menait au retrait. Après des changements additionnels de xAI, Apple a fini par approuver la dernière version soumise.

Ce qui est intéressant dans l'histoire, c'est la méthode. Pas de tweet de menace, pas de communiqué public. Apple utilise son levier le plus efficace, le rejet de soumission, qui bloque les mises à jour et empêche toute évolution du produit sur iOS.

Pour une app aussi active que Grok, c'est létal en quelques semaines. xAI a compris, a mis les correctifs, s'est remis en conformité.

La question de fond reste posée. Même après correction, un modèle génératif d'image peut être poussé à produire du contenu problématique via du prompt engineering, et c'est toujours contournante.

Apple ne vérifie pas le code de Grok, elle vérifie ce que les utilisateurs peuvent sortir dans des scénarios de test. Ça laisse une marge. Du coup, la conformité App Store est plutôt un baromètre qu'une garantie.

L'affaire rappelle aussi qu'Apple, quoi qu'on pense de son monopole sur iOS, reste un des rares acteurs capables de faire plier une boîte d'Elon Musk sans passer par un tribunal.

L'arbitrage, en passant par l'analyse suite à une soumission de l'app, est unilatéral, opaque, et parfois efficace. Les sénateurs qui avaient écrit à Apple et Google en janvier pour demander le retrait de Grok n'ont pas obtenu gain de cause, mais ils ont obtenu un rappel à l'ordre que xAI a dû suivre.

En tous cas, pour une fois, c'est un cas concret où le contrôle App Store a vraiment servi à quelque chose, et c'est surtout un rappel que la modération des modèles d'image en prod est toujours un vrai problème, et ce depuis qu'internet existe (vous vous souvenez de l'affaire Estelle Hallyday contre l'hébergeur Altern en 1999 ? Oui je suis aussi vieux que ça.

Source : Apple Insider

Sora ferme - Comment sauvegarder vos vidéos IA avant la coupure

Par : Korben
25 mars 2026 à 15:22

Sora, c'est fini les amis !

Hé oui, cest chacals d'OpenAI ferment leur plateforme de vidéos IA, et franchement, ça me rend un peu triste. À vrai dire, même si c'était que de la vidéo générée à partir de prompts, moi je me marrais bien. C'était fun de regarder le produit de ses prompts mais aussi de regarder les conneries des autres. Les versions québécoises, aïe aïe aïe, c'était quelque chose quand même !

Mais bon, le plus urgent maintenant, c'est de sauvegarder vos vidéos avant que tout disparaisse. OpenAI n'a pas encore communiqué de date précise pour la coupure, juste un vague « on vous dira bientôt ». Du coup, autant ne pas traîner, parce que quand ce genre de service cloud ferme, en général c'est pas 6 mois de préavis qu'on vous file...

Depuis la fuite du modèle jusqu'à aujourd'hui, Sora aura fait parler de lui. Côté raisons, c'est Fidji Simo (la patronne de la division Applications) qui a lâché le morceau : ils éparpillent leurs efforts sur trop d'apps, d'API et de stacks serveur différents, et ça les ralentit. En gros, entre préparer une entrée en bourse pour fin 2026 et cramer du GPU H100 sur des vidéos de chats en IA, le choix est vite fait. L'équipe de recherche Sora, elle, continuera à bosser sur la simulation de mondes 3D... mais pour la robotique. Et le fameux deal à 1 milliard de dollars avec Disney pour des films et séries ? Pouf, magie magie, c'est envolé !!

Faut dire que les chiffres n'étaient pas glorieux non plus. Après un lancement en fanfare fin 2024 (et une app iOS lancée à l'automne 2025 qui avait cartonné dans les charts), les téléchargements sur l'App Store avaient plongé de 32% entre novembre et décembre 2025. La hype, ça dure qu'un temps.

Mais maintenant les gens, on passe aux choses sérieuses !

Sora Backup - le script qui sauve vos vidéos

Je n'avais absolument pas de temps aujourd'hui, mais j'ai quand même taffé pour vous développer un petit script JavaScript qui récupère TOUTES vos vidéos Sora d'un coup, avec les prompts et les métadonnées, et qui vous génère un joli ZIP prêt à archiver. Pas besoin d'installer quoi que ce soit, pas d'extension louche. Vous avez juste besoin d'être connecté à votre profil Sora et d'un navigateur.

Comment ça marche

Allez sur sora.com , connectez-vous à votre compte, puis ouvrez la console JavaScript de votre navigateur (F12 sur Chrome ou Firefox, onglet Console). Ensuite, glissez-déplacez ou collez le script ci-dessous dedans et appuyez sur Entrée.

Le script va automatiquement récupérer votre token d'authentification (pas besoin de le chercher vous-même), puis il va paginer sur votre profil Sora pour récupérer tous vos posts publiés. Pour chaque post, il extrait les vidéos attachées (MP4), les télécharge, et empaquette le tout dans un fichier ZIP directement dans votre navigateur.

Y'a même un fichier manifest.json dans le ZIP qui contient tous vos prompts, les dimensions, les durées, les permalinks, les dates de création... bref, tout ce qu'il faut pour retrouver vos petits. Le ZIP est généré en format STORE (pas compressé, parce que compresser du MP4 ça sert à rien), avec un calcul CRC32 maison et sans aucune librairie externe.

Le script complet

Voici le code à coller dans la console :

// ==========================================================
// SORA BACKUP - Sauvegarde complète vidéos + images + prompts par Korben
// ==========================================================
// Usage : Ouvrir https://sora.com, F12 > Console, coller ce script
// Les fichiers sont téléchargés via le navigateur (dossier Downloads)
// Un fichier manifest.json récapitule tout (prompts, metadata, URLs)
// ==========================================================

(async () => {
 // --- Mini ZIP builder (STORE, pas de lib externe) ---
 const crc32table = new Uint32Array(256);
 for (let i = 0; i < 256; i++) {
 let c = i;
 for (let j = 0; j < 8; j++) c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
 crc32table[i] = c;
 }
 function crc32(buf) {
 let c = 0xFFFFFFFF;
 for (let i = 0; i < buf.length; i++) c = crc32table[(c ^ buf[i]) & 0xFF] ^ (c >>> 8);
 return (c ^ 0xFFFFFFFF) >>> 0;
 }
 const zipFiles = []; // {name, data (Uint8Array), crc, size}

 const PAGE_SIZE = 50;
 const DELAY_MS = 1500;
 const manifest = [];
 let totalDownloaded = 0;
 let totalErrors = 0;

 // --- Auth : récupérer le Bearer token ---
 // OPTION 1 : Coller ton token ici (Network tab > Authorization header)
 // OPTION 2 : Laisser vide, le script tentera de le récupérer auto
 let AUTH_TOKEN = '';

 async function getAuthToken() {
 if (AUTH_TOKEN) return AUTH_TOKEN;

 // Auto-detect : endpoint session ChatGPT
 for (const path of ['/api/auth/session', '/backend-api/auth/session']) {
 try {
 const r = await fetch(path, { credentials: 'include' });
 if (r.ok) {
 const json = await r.json();
 if (json.accessToken) {
 AUTH_TOKEN = json.accessToken;
 console.log(' 🔑 Token récupéré automatiquement');
 return AUTH_TOKEN;
 }
 }
 } catch(e) {}
 }

 // Fallback : demander à l'utilisateur
 const input = prompt(
 'Token non trouvé automatiquement.\n\n' +
 'Pour le récupérer :\n' +
 '1. F12 > onglet Réseau\n' +
 '2. Rafraîchis la page\n' +
 '3. Clique sur une requête /backend/...\n' +
 '4. Copie le header Authorization\n\n' +
 'Colle le token ici (Bearer eyJ...):'
 );
 if (input) {
 AUTH_TOKEN = input.replace(/^Bearer\s+/i, '').trim();
 return AUTH_TOKEN;
 }

 console.error(' ❌ Pas de token. Annulation.');
 return null;
 }

 // --- Fetch API avec auth ---
 async function apiFetch(url) {
 const token = await getAuthToken();
 const headers = {};
 if (token) headers['Authorization'] = 'Bearer ' + token;

 // oai-device-id requis par certains endpoints
 const deviceId = localStorage.getItem('oai-did') || '';
 if (deviceId) headers['oai-device-id'] = deviceId;

 const resp = await fetch(url, {
 method: 'GET',
 credentials: 'include',
 headers
 });

 if (!resp.ok) throw new Error(`HTTP ${resp.status} for ${url}`);
 return resp.json();
 }

 // --- Pagination générique ---
 async function fetchAllPages(baseUrl, dataField = 'data', cursorParam = 'after', cursorField = 'last_id') {
 let allItems = [];
 let cursor = '';
 let page = 0;

 while (true) {
 let url = baseUrl;
 if (cursor) url += `&${cursorParam}=${cursor}`;

 console.log(` 📄 Page ${++page} (${allItems.length} items so far)...`);
 const json = await apiFetch(url);

 const items = json[dataField];
 if (!Array.isArray(items) || items.length === 0) break;

 allItems = allItems.concat(items);
 cursor = json[cursorField] || '';

 if (!json.has_more && !cursor) break;
 await sleep(DELAY_MS);
 }

 return allItems;
 }

 // Variante pour les endpoints project_y (cursor-based)
 async function fetchAllPagesCursor(baseUrl) {
 let allItems = [];
 let cursor = '';
 let page = 0;

 while (true) {
 let url = baseUrl;
 if (cursor) url += `&cursor=${cursor}`;

 console.log(` 📄 Page ${++page} (${allItems.length} items so far)...`);
 const json = await apiFetch(url);

 const items = json.items;
 if (!Array.isArray(items) || items.length === 0) break;

 allItems = allItems.concat(items);
 cursor = json.cursor || '';

 if (!cursor) break;
 await sleep(DELAY_MS);
 }

 return allItems;
 }

 function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

 // --- Extraire URL du média depuis une generation ---
 function getMediaUrl(gen) {
 return gen?.encodings?.source?.path
 || gen?.downloadable_url
 || gen?.url
 || '';
 }

 // --- Extraire le prompt (peut être dans actions, prompt, ou input_text) ---
 function getPrompt(item, gen) {
 // Prompt direct
 if (gen?.prompt) return gen.prompt;
 if (item?.prompt) return item.prompt;
 if (item?.input_text) return item.input_text;
 // Storyboard : les actions sont les descriptions des scènes
 if (item?.actions && typeof item.actions === 'object') {
 return Object.entries(item.actions)
 .sort((a,b) => Number(a[0]) - Number(b[0]))
 .map(([frame, desc]) => `[frame ${frame}] ${desc}`)
 .join(' | ');
 }
 if (gen?.actions && typeof gen.actions === 'object') {
 return Object.entries(gen.actions)
 .sort((a,b) => Number(a[0]) - Number(b[0]))
 .map(([frame, desc]) => `[frame ${frame}] ${desc}`)
 .join(' | ');
 }
 return '';
 }

 // --- Dérouler les items du profil Sora en items plats ---
 function flattenProfileItems(items) {
 const flat = [];
 for (const item of items) {
 const post = item.post || item;
 const attachments = post.attachments || [];
 if (attachments.length === 0) continue;

 for (const att of attachments) {
 const url = att.encodings?.source?.path || att.downloadable_url || att.url || '';
 if (!url) continue;

 flat.push({
 id: post.id || att.generation_id || '',
 generation_id: att.generation_id || '',
 task_id: att.task_id || '',
 title: att.title || post.discovery_phrase || '',
 prompt: post.text || '',
 emoji: post.emoji || '',
 type: att.generation_type || att.kind || '',
 width: att.width || 0,
 height: att.height || 0,
 duration_s: att.duration_s || 0,
 is_public: !!post.posted_to_public,
 created_at: post.posted_at ? new Date(post.posted_at * 1000).toISOString() : '',
 url: url,
 permalink: post.permalink || '',
 username: item.profile?.username || '',
 });
 }
 }
 return flat;
 }

 // --- Sanitize filename ---
 function sanitize(name) {
 return name.replace(/[<>:"\/\\|?*\x00-\x1f]/g, '_').substring(0, 100);
 }

 // --- Ajouter un fichier au ZIP ---
 async function addToZip(url, filename) {
 try {
 const resp = await fetch(url);
 if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
 const buf = await resp.arrayBuffer();
 const data = new Uint8Array(buf);
 zipFiles.push({ name: filename, data, crc: crc32(data), size: data.length });
 totalDownloaded++;
 return true;
 } catch(e) {
 console.warn(` ⚠️ Erreur ${filename}:`, e.message);
 totalErrors++;
 return false;
 }
 }

 // --- Déduire l'extension ---
 function getExt(url, type) {
 if (!url) return type === 'video' ? '.mp4' : '.png';
 const m = url.match(/\.(mp4|webm|mov|png|jpg|jpeg|webp|gif)/i);
 return m ? '.' + m[1].toLowerCase() : (type === 'video' ? '.mp4' : '.png');
 }

 // ==========================================================
 // MAIN
 // ==========================================================
 const origin = window.location.origin;
 console.log('🎬 SORA BACKUP - Démarrage');
 console.log('='.repeat(50));

 // 1. Mes posts Sora (profil)
 console.log('\n📦 1/2 - Récupération de mes posts Sora...');
 let myPosts = [];
 try {
 myPosts = await fetchAllPagesCursor(
 `${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=nf2`
 );
 console.log(`  ${myPosts.length} posts de profil`);
 // Debug premier item
 if (myPosts.length > 0) {
 const first = myPosts[0];
 console.log(' 🔍 Premier item - clés:', Object.keys(first).join(', '));
 console.log(' 🔍 URL:', first.url?.substring(0, 80) || 'none');
 console.log(' 🔍 DL:', first.downloadable_url?.substring(0, 80) || 'none');
 console.log(' 🔍 ENC:', first.encodings?.source?.path?.substring(0, 80) || 'none');
 console.log(' 🔍 GENS:', first.generations?.length || 'none');
 console.log(' 🔍 TITLE:', first.title || 'none');
 }
 } catch(e) {
 console.warn(' ⚠️ profil failed:', e.message);
 }

 // 2. Mes likes sur Sora
 console.log('\n📦 2/2 - Récupération de mes likes Sora...');
 let myLikes = [];
 try {
 myLikes = await fetchAllPagesCursor(
 `${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=appearances`
 );
 if (myCameos.length) console.log(`  ${myCameos.length} cameos trouvés`);
 } catch(e) {}

 // --- Dérouler les generations et dédupliquer ---
 console.log('\n🔄 Extraction des vidéos...');
 const rawAll = [...myPosts, ...myLikes];
 const flatItems = flattenProfileItems(rawAll);

 const seen = new Set();
 const allItems = [];
 for (const item of flatItems) {
 if (item.id && seen.has(item.id)) continue;
 // Filtrer : vidéos uniquement
 const isVideo = item.type === 'video_gen' || item.url.includes('/videos/') || item.url.includes('.mp4');
 if (!isVideo) continue;
 if (item.id) seen.add(item.id);
 allItems.push(item);
 }

 console.log(`📊 Total unique: ${allItems.length} vidéos à télécharger`);
 console.log('='.repeat(50));

 // --- Construire le manifest et télécharger ---
 console.log('\n⬇️ Téléchargement en cours...');
 console.log('(Les fichiers arrivent dans ton dossier Downloads)');

 for (let i = 0; i < allItems.length; i++) {
 const meta = allItems[i];
 const url = meta.url;

 if (!url) {
 console.log(` ⏭️ [${i+1}/${allItems.length}] ${meta.id} - pas d'URL, skip`);
 meta.downloaded = false;
 manifest.push(meta);
 continue;
 }

 const type = (meta.task_type === 'image_gen' || url.match(/\.(png|jpg|jpeg|webp|gif)/i)) ? 'image' : 'video';
 const ext = getExt(url, type);
 const nameBase = meta.title
 ? sanitize(meta.title)
 : (meta.prompt ? sanitize(meta.prompt.substring(0, 60)) : meta.id);
 const filename = `sora_${String(i+1).padStart(4,'0')}_${nameBase}${ext}`;

 console.log(` ⬇️ [${i+1}/${allItems.length}] ${filename}`);
 meta.filename = filename;
 meta.downloaded = await addToZip(url, filename);
 manifest.push(meta);

 // Pause entre downloads pour pas surcharger
 if (i < allItems.length - 1) await sleep(800);
 }

 // --- Ajouter le manifest au ZIP ---
 console.log('\n📝 Ajout du manifest au ZIP...');
 const manifestData = new TextEncoder().encode(JSON.stringify(manifest, null, 2));
 zipFiles.push({ name: 'manifest.json', data: manifestData, crc: crc32(manifestData), size: manifestData.length });

 // --- Générer le ZIP (format STORE, pas de compression) ---
 console.log('\n📦 Génération du ZIP...');
 const enc = new TextEncoder();
 const blobParts = [];
 const centralParts = [];
 let offset = 0;

 for (const f of zipFiles) {
 const nameBytes = enc.encode(f.name);
 // Local file header (30 bytes + name)
 const lh = new ArrayBuffer(30);
 const lv = new DataView(lh);
 lv.setUint32(0, 0x04034b50, true);
 lv.setUint16(4, 20, true);
 lv.setUint16(8, 0, true); // STORE
 lv.setUint32(14, f.crc, true);
 lv.setUint32(18, f.size, true);
 lv.setUint32(22, f.size, true);
 lv.setUint16(26, nameBytes.length, true);
 blobParts.push(new Uint8Array(lh), nameBytes, f.data);

 // Central directory entry (46 bytes + name)
 const ch = new ArrayBuffer(46);
 const cv = new DataView(ch);
 cv.setUint32(0, 0x02014b50, true);
 cv.setUint16(4, 20, true);
 cv.setUint16(6, 20, true);
 cv.setUint16(10, 0, true); // STORE
 cv.setUint32(16, f.crc, true);
 cv.setUint32(20, f.size, true);
 cv.setUint32(24, f.size, true);
 cv.setUint16(28, nameBytes.length, true);
 cv.setUint32(42, offset, true);
 centralParts.push(new Uint8Array(ch), nameBytes);

 offset += 30 + nameBytes.length + f.size;
 }

 const centralSize = centralParts.reduce((s, p) => s + p.length, 0);
 const eocd = new ArrayBuffer(22);
 const ev = new DataView(eocd);
 ev.setUint32(0, 0x06054b50, true);
 ev.setUint16(8, zipFiles.length, true);
 ev.setUint16(10, zipFiles.length, true);
 ev.setUint32(12, centralSize, true);
 ev.setUint32(16, offset, true);

 const zipBlob = new Blob([...blobParts, ...centralParts, new Uint8Array(eocd)], { type: 'application/zip' });

 const zipName = `sora_backup_${new Date().toISOString().split('T')[0]}.zip`;
 const a = document.createElement('a');
 a.href = URL.createObjectURL(zipBlob);
 a.download = zipName;
 document.body.appendChild(a);
 a.click();
 document.body.removeChild(a);
 URL.revokeObjectURL(a.href);

 // --- Résumé ---
 const sizeMB = (zipBlob.size / 1024 / 1024).toFixed(1);
 console.log('\n' + '='.repeat(50));
 console.log('🎬 SORA BACKUP TERMINÉ');
 console.log(`  Vidéos dans le ZIP : ${totalDownloaded}`);
 console.log(`  Erreurs : ${totalErrors}`);
 console.log(` 📦 Fichier : ${zipName} (${sizeMB} MB)`);
 console.log(` 📝 manifest.json inclus dans le ZIP`);
 console.log('='.repeat(50));
})();

Quelques précisions

Si le token n'est pas récupéré automatiquement (ça peut arriver selon votre config), le script vous demandera de le coller manuellement. Pour le trouver, c'est simple : F12 > onglet Réseau > rafraîchissez la page > cliquez sur n'importe quelle requête vers /backend/... > copiez le header Authorization.

D'ailleurs, si la vidéo IA vous branche toujours, Higgsfield propose des séries entièrement générées par IA. C'est pas la même approche que Sora, mais c'est un signe que la vidéo IA ne meurt pas avec la fermeture d'un seul service.

Bon, bref, c'est la fin d'un truc sympa. Moi je préférais largement scroller sur Sora que d'aller sur TikTok ou Instagram parce qu'au moins c'était drôle !

Merci à mes Patreons qui me permettent de prendre le temps de développer ce genre de petits outils pour vous. Sans eux, j'aurais jamais pu me poser une après-midi pour coder ça.

Source

Higgsfield - Le Netflix de l'IA où 4 personnes remplacent tout un studio

Par : Korben
21 mars 2026 à 09:00

100 millions de dollars, c'est ce que coûterait normalement la production d'un pilote de qualité ciné, d'après Higgsfield, une boite basée à San Francisco et fondée par Alex Mashrabov.

Et eux, ils l'ont fait en 4 jours avec une équipe de 4 personnes et quelques GPU. Bienvenue dans l'ère du streaming généré par IA !

La plateforme vient en effat de lancer ses Original Series , une sorte de Netflix où tout le catalogue est généré par IA. On y trouve 13 séries dispo (sci-fi, thriller, anime, comédie...) avec des titres comme Arena Zero, Spit & Glow ou encore Tails of Steel, plus 6 autres en préparation. Et tout ça, des dialogues aux effets visuels en passant par le doublage, est généré par intelligence artificielle (même si évidemment, y'a des humains derrière pour le scénario, le prompting et le montage).

Mais le truc fou je trouve, c'est le modèle communautaire. En fait, Higgsfield a organisé un concours qui a attiré plus de 8 700 créateurs venus de plus de 100 pays, comme ça plutôt que de produire en interne, ils laissent la communauté proposer des teasers. Les spectateurs votent alors pour ceux qu'ils préfèrent, et les gagnants se retrouvent à produire des séries complètes avec l'équipe.

Cela veut dire que n'importe qui avec une bonne idée et un bon sens du prompt peut devenir "réalisateur"... sans jamais toucher une caméra ni un plateau de tournage.

Côté boîte à outils, la plateforme ne fait pas les choses à moitié. Y'a le Cinema Studio 2.5 pour la génération vidéo , et la plateforme intègre des modèles tiers comme Kling 3.0 (vidéos de 15 secondes avec personnages cohérents), Sora 2 , Veo 3.1, et même du clonage vocal via ElevenLabs. Pour l'image, y'a Nano Banana Pro (oui, c'est le vrai nom) qui sort du 4K, et plus de 100 apps prêtes à l'emploi pour le face swap, les VFX ou la création de contenu commercial.

Par contre, tout ça repose sur des modèles tiers... donc le jour où OpenAI ou Google changent les conditions liées à leurs API, ça peut les secouer un peu.

Maintenant pour ceux qui se demandent si c'est gratuit, oui, y'a un tier free avec des crédits quotidiens via l'app mobile Diffuse. Sauf que les crédits partent trèèès vite, car générer une vidéo de 15 secondes en 4K, ça consomme pas mal de compute. Pour les gros volumes, faudra donc passer à la caisse.

Alors c'est pas encore 100% nickel mais j'ai été vraiment bluffé par cet épisode par exemple :

C'est vrai que le lipsync n'est pas toujours perfecto, que les mains font parfois n'importe quoi, et que la continuité entre les plans n'est pas toujours raccord.

Mais le concept est dingue quand même car là où il fallait un studio avec des centaines de techniciens, des caméras RED à 50 000 balles et des mois de post-production, y'a maintenant un pipeline automatisé qui prend un scénario et crache un épisode complet. Et le fait que les créateurs viennent du monde entier, sans formation ciné, ça change tout en terme de scénario et de diversité de contenus !

Donc, si vous voulez voir à quoi ressemble le cinéma actuel quand c'est l'IA qui tient la caméra, allez jeter un œil. C'est encore un peu brouillon mais ça progresse très vite (trop ?), je trouve...

Non, votre PC Windows 11 n’a pas de problème de Bluetooth (contrairement à ce que vous avez lu)

Par : Pierre Caer
18 mars 2026 à 09:28
Hier, plusieurs sites ont relayé une information alarmante comme quoi Windows 11 serait touché par un bug sérieux rendant tous vos périphériques Bluetooth invisibles et obligeant Microsoft à intervenir en urgence. Mais ce que ces sites se sont bien gardé bien vous dire (pour vous pousser à cliquer et réagir), c’est que ce bug ne … Lire la suite

Source

Non, Windows 12 ne sortira pas en 2026 : voici ce que prépare vraiment Microsoft

Par : Pierre Caer
5 mars 2026 à 12:00
Depuis quelques jours, une rumeur enflamme les forums et les réseaux sociaux : Microsoft s’apprêterait à lancer Windows 12 en 2026, avec un design radicalement revu, l’intelligence artificielle au cœur du système et même un abonnement mensuel à la clé. L’information, relayée massivement sur Reddit, a provoqué une vague d’indignation chez des utilisateurs déjà échaudés … Lire la suite

Source

Windows 11 : non, votre vieille imprimante ne va pas cesser de fonctionner en 2026

Par : Pierre Caer
20 février 2026 à 15:53
Depuis plusieurs semaines, des articles alarmistes affirment que Windows 11 « couperait les vivres » aux anciennes imprimantes, que votre vieille imprimante « pourrait cesser de fonctionner du jour au lendemain » et que le seul recours serait de racheter un nouveau matériel. Sauf que c’est largement exagéré, et parfois tout simplement faux. En réalité, Microsoft ne met pas … Lire la suite

Source

❌
❌