2 points par GN⁺ 5 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Le t-shirt au design Akamai vendu dans les magasins Uniqlo comportait un code bash obfusqué imprimé, qui exécutait avec eval le résultat de base64 --decode, mais il s’agissait en réalité d’un easter egg pour la campagne Peace for All
  • Une fois décodé le Here string encodé en Base64, on obtient un script qui affiche en boucle dans le terminal le message ♥PEACE♥FOR♥ALL♥ sous forme d’animation sinusoïdale
  • Comme Base64 n’intègre pas de correction d’erreurs, la transcription était délicate ; après avoir vérifié le padding de la chaîne ainsi que les guillemets et accolades, les résultats d’OCR Android, de Tesseract et de Claude ont été comparés puis consolidés
  • Le script décodé combine tput, bc et des séquences d’échappement ANSI 256 couleurs pour calculer la position et la couleur des caractères selon la taille du terminal, et restaure le curseur lors d’une sortie avec CTRL+C
  • Akamai a expliqué le lien entre le vrai code au dos et Linux ; la police, initialement supposée être Consolas, a été corrigée en Roboto Mono

Du code exécutable au dos du t-shirt

  • Le devant du t-shirt Uniqlo x Akamai Peace for All montre un cœur entre accolades, tandis que le dos affiche un grand bloc alphanumérique
  • En regardant de près, ce bloc est du code bash commençant par un shebang, structuré pour décoder un Here string encodé en Base64 avec base64 --decode puis le passer à eval
  • À première vue, cela peut ressembler à une « méthode de diffusion de virus », mais l’objectif réel est d’afficher un message easter egg
  • Le t-shirt est un produit conçu par Akamai en soutien à la campagne Peace for All d’Uniqlo

Processus d’OCR et de transcription

  • Base64 ne disposant pas de mécanisme de correction d’erreurs, il fallait une transcription parfaite pour convertir la chaîne imprimée en une forme exécutable
  • La chaîne se terminait par le padding attendu, et les guillemets comme les accolades correspondaient, ce qui rendait probable qu’il s’agisse d’un code complet
  • Trois méthodes ont été utilisées ensemble pour la transcription
    • L’OCR intégré à circle-to-search sur Android
    • Tesseract avec plusieurs options et ajustements
    • L’OCR et la génération d’un tableau de positions via Claude
  • Les trois résultats ont été comparés par diff afin de repérer les divergences, puis les parties restantes ont été nettoyées manuellement
  • Un autre design de t-shirt de la même ligne Uniqlo x Akamai semble avoir été coupé dans un bloc de code plus large : les imports sont tronqués et return se termine par retu, le rendant impossible à compiler

Fonctionnement du script bash décodé

  • Le décodage du Base64 révèle un easter egg bash bien commenté
  • Le début du script contient des messages de félicitations en anglais et en japonais
    • Congratulations! You found the easter egg! ❤️
    • おめでとうございます!隠されたサプライズを見つけました!❤️
  • La chaîne animée est répétée sous la forme ♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL...
  • La taille du terminal est récupérée avec tput cols et tput lines, et la longueur de la chaîne est calculée avec ${#text} en bash
  • Le curseur est masqué avec tput civis, et à la réception de SIGINT, il est restauré avec tput cnorm; exit

Implémentation de l’animation

  • La boucle s’exécute en continu sous forme de boucle infinie for (( t=0; ; t+=1 ))
  • À chaque itération, le caractère à afficher est pris un par un dans text
  • Le calcul de position utilise bc -l pour obtenir la valeur du sinus
    • angle = t * 0.2
    • sine_value = s(angle)
    • x = (cols / 2) + (cols / 4) * sine_value
  • La valeur calculée de x est corrigée pour rester dans les limites du terminal, entre 0 et cols - 1
  • La couleur est calculée comme un dégradé entre 12, correspondant au cyan, et 208, correspondant à l’orange, dans la palette 256 couleurs
  • L’affichage utilise des séquences d’échappement ANSI et tput cup pour imprimer le caractère coloré à la position indiquée, puis descend à la ligne suivante
  • Au final, le message de la campagne Peace for All apparaît dans le terminal sous forme de boucle sinusoïdale continue

Police et explication du design par Akamai

  • L’hypothèse initiale concernant la police était Consolas, mais après vérification par l’utilisateur Hacker News ralphinus, elle a été corrigée en Roboto Mono
  • Parmi les indices ayant mené à la mauvaise hypothèse figuraient le 0 légèrement barré en diagonale, le 1 sans empattement, ainsi que les courbes arrondies de BDyg et du chiffre 2
  • Lors de la sortie du t-shirt, Akamai a expliqué le message du design dans un communiqué de presse
  • Le brun clair évoque les boîtiers en plastique « beige box » des premiers ordinateurs connectés à Internet, tandis que le cœur au recto représente l’usage d’Internet à des fins positives dans le monde entier
  • Le vrai code au dos est une référence à Linux, qu’Akamai relie à « la langue open source d’Internet » et à un langage commun pour un monde plus sûr et mieux connecté
  • Parmi les autres personnes intéressées par ce même t-shirt figure un article de Wen Chuan Lee, qui renvoie vers un autre article lié

1 commentaires

 
GN⁺ 5 시간 전
Avis sur Hacker News
  • « L’autre t-shirt vendu dans la même gamme par Uniqlo x Akamai contient du code qui est manifestement un design inachevé »
    C’est drôle d’imaginer devoir renvoyer un t-shirt parce qu’il dysfonctionne
    « Pourquoi le renvoyez-vous, la taille n’allait pas ou il ne vous plaisait pas ? »
    « Non, il y a une erreur de syntaxe à la ligne 37, donc il ne s’exécute pas, et je crains que les gens dans la rue pensent que je fais la promotion de scripts Bash non sécurisés »

    • Aux employés du service client d’Uniqlo : si quelqu’un essaie de renvoyer un t-shirt à cause d’une erreur dans du code informatique imprimé, refusez et répondez : « Un vrai script kiddie aurait repéré l’erreur avant de l’acheter »
    • Je suis shell-shocked de voir un tel manque d’assurance qualité. Ils pourraient au moins appliquer un patch ?
  • Si vous aimez ce genre de choses, le travail de Martin Kleppe pourrait aussi vous plaire. Par exemple, il y a la Quine Clock
    https://aem1k.com/qlock/
    J’en avais aussi fait une rétro-ingénierie sous forme non obfusquée il y a quelques années
    https://gist.github.com/olooney/a89db3932b089925b71b68d7e9f2...
    Il a aussi créé beaucoup d’autres excellentes visualisations ASCII
    https://aem1k.com/

    • Est-ce vraiment un quine ?
      C’est extrêmement impressionnant, mais quand même
  • La police n’est pas Consolas, mais Roboto Mono
    Le plus étrange, c’est que la police elle-même est bien une police à chasse fixe, mais que la composition du t-shirt ne l’est pas. Il y a du crénage, particulièrement visible sur la paire « Iy », et les caractères étroits comme « i » semblent occuper moins d’espace horizontal. À vue de nez, cela a dû être composé avec un outil du type « optical kerning » d’InDesign

    • Quelqu’un a-t-il déjà créé une police à chasse fixe avec crénage dynamique ? C’est une idée un peu saugrenue à laquelle je n’avais jamais pensé avant de lire le commentaire ci-dessus. Au début ça semble absurde, mais écoutez
      On utilise une police à chasse fixe parce qu’elle s’aligne bien sur une grille. Mais même à l’intérieur de cette grille, il y a de la marge pour déplacer un caractère un peu vers la gauche ou vers la droite, ce qui pourrait donner une police à chasse fixe plus lisible. Bien sûr, chaque fois qu’un caractère est décalé vers la gauche, l’espace à droite augmente, avec une probabilité à peu près équivalente de produire un résultat horrible
    • Je crois que c’est exact. J’ai ajouté une correction à l’article et cité ce commentaire
  • Ce t-shirt est vraiment génial. Il existe une bonne vidéo où le designer explique le processus de création. Elle inclut aussi la manière dont ils ont délibérément rendu l’OCR difficile : https://youtu.be/jocGLiecpjU?t=526

    • Il est peut-être plus rapide de simplement tout retaper à la main que de trouver une méthode d’OCR. Ça doit rappeler l’époque où l’on recopiait du code de jeux depuis le magazine COMPUTE! il y a 45 ans
      https://archive.org/details/1983-01-compute-magazine/page/96...
    • Je suis l’auteur de l’article. Je n’avais pas vu ce lien, merci beaucoup. Je suis content de le découvrir, et aussi ravi de voir que le fait que l’OCR soit difficile n’était pas seulement mon problème, mais un choix de conception intentionnel
    • J’ai regardé le lien, mais je n’ai pas trouvé le passage où ils disent avoir rendu l’OCR difficile. Qu’ont-ils fait exactement pour compliquer l’OCR ?
    • Pourtant l’OCR n’est pas difficile. Je ne sais même pas pourquoi l’article y consacre toute une section
      Sur un Samsung S24U, j’ai maintenu le bouton « circle to search » de l’écran d’accueil pour ouvrir l’interface des outils d’IA, puis j’ai fait un appui long sur le texte et tout copié d’un coup. Je ne connais pas le nom officiel de la fonction, mais ça a pris environ 2 secondes
  • Faire de l’OCR là-dessus est un cauchemar, et c’est un bon benchmark pour les outils qui prétendent être de bons modèles OCR/vision
    Cela dit, avec un outil agentique branché sur un bon modèle de vision récent comme Claude ou GPT, en lui donnant l’image, en la découpant ligne par ligne puis en lui demandant de faire l’OCR de chaque ligne séparément, ça devrait se faire assez facilement
    Je me demande aussi si ce script lui-même a été écrit par un LLM avant l’obfuscation. Il semble y avoir pas mal de commentaires, mais dans ce cas ça va quand même :)

    • Je ne pense pas qu’il ait été écrit par un LLM. Plusieurs choses sautent aux yeux
      Le message de félicitations est à la fois en anglais et en japonais, et il y a un emoji cœur. Il y avait clairement une intention de dégradé du bleu-vert à l’orange, mais la plage commence dans le bloc ANSI et se termine au milieu du bloc des 256 couleurs, alors que les 256 couleurs de terminal ne sont de toute façon pas organisées en dégradé. Et il n’y a pas de sleep à la fin de la boucle, alors qu’un LLM l’aurait probablement ajouté par précaution
    • Ce n’est pas si difficile. Notre modèle OCR industriel l’a lu correctement du premier coup avec les paramètres par défaut
      Les caractères se séparent facilement, et il n’y a pas d’arrière-plan structurel qui perturbe le lecteur, contrairement par exemple à une date de péremption sur un opercule en aluminium de yaourt. Il n’y a presque pas de textures quasi textuelles pour brouiller le résultat, et la police est nette et standard
    • La dernière fois qu’Internet s’est acharné à faire l’OCR d’un bout de base64, c’était il y a quelques mois. Le DoJ avait publié en masse les e-mails d’une personne décédée, mais sous forme de PDF rastérisés
      Je ne me souviens plus du nom maintenant. Il s’est passé trop de choses accaparantes depuis
    • La fonction de copie de texte depuis une image dans Safari gère presque toute la partie base64 de la chaîne. Elle a seulement lu le premier caractère comme I au lieu de T
      Bizarrement, si j’essaie de copier toute la chaîne, y compris la partie hashbang, les performances deviennent bien pires. Je me demande ce qu’ils font en interne pour que ça marche aussi bien
    • Vraiment un cauchemar ? J’ai collé la première miniature du t-shirt dans ChatGPT, et il l’a décodée du premier coup, puis m’a expliqué ce que faisait le script Bash
  • Appeler l’encodage base64 de l’obfuscation
    Je m’attendais à une technique sympa de désobfuscation JS ; pour rester poli, ma déception est incommensurable et ma journée est gâchée

  • Waouh, j’avais vu ce t-shirt en boutique et dit à ma copine : « Ce script ne peut pas vraiment fonctionner, c’est sûrement juste décoratif. » J’aurais dû creuser davantage

    • C’est facile à rater. La plupart du temps, nous ne sommes pas posés, et nos pensées sont en pilotage automatique
  • Pas mal. Mon seul regret à propos du script, c’est qu’il aurait sans doute fallu mettre
    sleep 0.1
    dans la boucle. Comme ça, on pourrait vraiment lire ce qui s’affiche dans le terminal. Les terminaux modernes défilent trop vite pour qu’on voie les messages passer.
    Ralentir à environ 10 Hz de rafraîchissement rendrait le tout très agréable à regarder

    • Alors on pourrait peut-être y coudre un patch ?
  • J’ai trouvé ça drôle de voir l’auteur essayer plusieurs outils d’OCR, obtenir des résultats inégaux, puis passer un long moment à corriger manuellement la meilleure sortie. Au lieu de simplement retaper le texte lui-même

    • J’ai pensé la même chose. Mais je fais partie de cette génération qui a grandi en recopiant pendant des heures, sur un clavier en caoutchouc, des « jeux » publiés dans des magazines et des livres. Puis il fallait encore passer des heures à corriger les fautes de frappe
    • Je l’ai passé dans PaddlePaddle OCR et il s’en est sorti parfaitement.
      L’OCR de Google via Google Lens sur téléphone l’a aussi extrait plutôt correctement, mais pas avec 100 % d’exactitude. Cela dit, corriger le résultat aurait probablement pris bien moins de temps que le recopier à la main. Je ne sais pas ce que l’auteur a utilisé, mais j’aurais aimé qu’il partage ses essais d’OCR ; il a probablement testé des outils d’OCR assez basiques
    • Il m’a fallu presque 2 minutes pour saisir 4 lignes, et j’ai raté un caractère.
      Moi aussi, je choisirais évidemment l’OCR. Il faut être prêt pour le prochain t-shirt Bash que je croiserai
    • Ça me rappelle la réalité de l’automatisation des tâches en entreprise. Il est courant que des ingénieurs passent plus de 40 heures à automatiser quelque chose qu’un débutant pourrait faire manuellement en 10 minutes et qui n’est nécessaire qu’une fois par semaine. Tout automatiser semble être l’avenir
    • « Juste le taper » risque de produire plus d’erreurs chez une personne moyenne
  • Un ancien collègue avait un t-shirt avec un programme Go, et je l’ai toujours trouvé plutôt cool
    [0] https://github.com/GL-Kageyama/UNIQLO_Akamai_T-shirt_Code

    • Je ne savais pas trop s’il parlait d’un programme de jeu de go, ou du langage Go. Ce serait amusant que quelqu’un crée un programme de go en Go
    • J’en ai acheté un cette année avec du code Go dessus. Je n’avais absolument pas imaginé que c’était du vrai code, je pensais que c’était juste du contenu aléatoire