Utiliser le display « grid » de CSS

Comme chacun sait, le mode d'affichage d'un élément HTML se contrôle via la propriété CSS display.
Utiliser le display grid en CSS
Depuis fort longtemps déjà, ce mode peut être une des deux variantes définie dans la spécification du module Grid de CSS : grid ou inline-grid. Cela a permis d'éradiquer les <table>, <tr> et autres <td>.
A l'occasion du retour sur le développement d'une application Web laissée en chantier depuis bien trop longtemps, l'auteur de ces lignes a mis en ordre des notes sur l'utilisation de ce mode d'affichage. Dès lors, pourquoi ne pas en faire profiter tout le monde ?
Continuer la lecture de "Utiliser le display « grid » de CSS"
Utiliser le display « grid » de CSS

La sécurité de l’IA générative à base de LLM

Dans un précédent article, il avait été question d'attaques sur un agent à base de LLM, typiquement un chat. En effet, un tel agent interprète le prompt non seulement comme un texte à compléter, mais aussi comme une liste d'instructions à suivre, ce qui fait de ce texte un vecteur d'attaque d'autant plus intéressant à exploiter que personne aujourd'hui ne peut dire comment fonctionne un LLM, si bien qu'il est impossible d'en sécuriser l'usage.
La sécurité des systèmes d'IA générative à base de LLM
Dans ces conditions, la prolifération des agents constitue un enjeu considérable du point de vue de la sécurité informatique, et c'est sans surprise que les agences telles que l'ANSSI ont entrepris de sensibiliser les organisations à ce sujet.
Toutefois, il n'y a pas que les risques techniques dont il est nécessaire de tenir compte. En effet, les risques juridiques ne sont pas moindres, tout particulièrement ceux qui ressortissent au traitement des données à caractère personnel.
NB : Ce billet a été rédigé mi-août par un humain et non une boîte de conserve, et publié dans une version réduite dans le HS n° 16 de Programmez! d'octobre 2024 consacré à la sécurité informatique, et en version intégrale dans le n° 266 de Programmez! de novembre 2024.
Continuer la lecture de "La sécurité de l’IA générative à base de LLM"
La sécurité de l’IA générative à base de LLM

Attaque sur les LLMs

Pour celui qui s'est un peu exercé avec, la fascination qu'exerce un LLM tient moins à sa capacité à produire un texte intelligible, qu'à la révélation des multiples domaines dans lesquels il est susceptible de fournir ainsi une réponse à une question qu'on lui pose.
Non moins fascinante est sa capacité à se laisser abuser selon la manière la question est formulée, essentiellement pour contourner les restrictions qui pèsent sur la réponse qu'il peut retourner.
Attaque sur les LLMs
Qu'en est-il à date de cette exploitation d'un LLM, au sens sécurité du terme ?
NB : Publié sur ce blog avec retard, ce billet a été rédigé début mars par un humain et non une boîte de conserve, et publié dans le numéro spécial IA de Programmez! d'avril 2024.
Continuer la lecture de "Attaque sur les LLMs"
Attaque sur les LLMs

Chronique de l’IA #7

Dans l'un des meilleurs épisodes de l'excellente série The West Wing, qui remonte à 2004, Leo McGarry se lamente : "My generation never got the future it was promised". Mais l'ordinateur personnel, objecte Josh Lyman ? "A more efficient delivery system for gossip and pornography? Where's my jet pack, my colonies on the Moon?", réplique Leo, impitoyable.
Chronique de l'IA #7
Voilà la situation qu'il leur faudrait éviter, mais à force de vouloir précipiter les choses, certains acteurs de l'IA, et non des moindres, donnent parfois l'impression de vouloir la provoquer. L'on avait vu Google se prendre les pieds dans le tapis à plusieurs reprises, mais ce n'est rien en comparaison de ce que Microsoft a réussi à faire...
Cela, dans un climat qui devient fébrile pour les investisseurs, du fait des défauts inhérents à l'IA et de l'absence de "killer application", toutes choses qui ne peuvent qu'alimenter la prudence des entreprises.
Cela étant, ça progresse dans les coulisses, mais c'est plus dans la compréhension d'en quoi l'IA consiste que dans son évolution vers l'AGI.
NB : Ce billet a été rédigé début juin par un humain et non une boîte de conserve, et publié dans le numéro #265 de Programmez! de septembre 2024.
Continuer la lecture de "Chronique de l’IA #7"
Chronique de l’IA #7

Une compilation d’articles sur la programmation en assembleur du hardware de l’Amiga

Rien n'est éternel, et certainement pas ce blog. Mais à quoi bon avoir rédigé tant d'articles pour expliquer la programmation en assembleur du hardware de l'Amiga en prenant pour prétexte la réalisation de cracktros, si cela devait être perdu un jour ?
Yragael's stash of code
Pour prévenir le drame, j'ai converti tous les articles concernés sous forme de pages Web, et réuni ces dernières ainsi que le code et les données des cracktros évoquées au sein d'une seule et même archive. Ainsi tout les articles peuvent être consultés hors ligne. Il y a même quelques bonus, pour ceux qui iront fouiller dans les répertoires.
N'hésitez pas à télécharger cette archive et à la faire circuler auprès de ceux que la programmation en assembleur du hardware de l'Amiga pourrait intéresser.
Pour nos amis germanophiles, je signale qu'un travail similaire d'archivage a été réalisé par le sympathique Göran Strack en septembre 2023. Au prix d'un bel effort, ce dernier a tout traduit en allemand et mis l'ensemble à disposition sur Aminet sous la forme de l'archive dev/asm/asm-kurs_stashofcode.lha. Merci à lui !
Continuer la lecture de "Une compilation d’articles sur la programmation en assembleur du hardware de l’Amiga"
Une compilation d’articles sur la programmation en assembleur du hardware de l’Amiga

Téléchargement progressif avec fetch ()

Fetch est une API propre aux navigateurs qui permet de présenter des requêtes à un serveur HTTP par voie de programmation, autrement dit depuis du code JavaScript.
Fetch remplace XMLHttpRequest, dont elle est une version plus moderne. En particulier :
  • XMLHttpRequest est bien une API asynchrone, mais elle repose sur le recours à des callbacks. Or ECMAScript 2015 a introduit les promesses pour faciliter la programmation asynchrone en échappant au "callback hell", mais XMLHttpRequest n'en tient pas compte.
  • Du fait de Same-Origin Policy (SOP), XMLHttpRequest ne permet pas de récupérer une ressource dont l'origine est différente de celle de la page. Or SOP a été tempérée en introduisant Cross-Origin Resource Sharing (CORS), mais XMLHttpRequest n'en tient pas compte.
Pour se familiariser avec Fetch, l'on se propose d'écrire une API qui permet de récupérer une série de ressources tout en étant tenu informé de la progression du téléchargement de chacune.
Suivi de la progression de téléchargements simultanés avec fetch ()
Le code JavaScript devra être aussi simple que possible, mais on n'échappera pas à la mobilisation de quelques concepts fondamentaux : les promesses, la récursivité, les closures, etc. Pas d'affolement, tout est expliqué en détail !
Continuer la lecture de "Téléchargement progressif avec fetch ()"
Téléchargement progressif avec fetch ()

CORS avec Node.js

Pour faire face à la montée des menaces sur leurs utilisateurs, les navigateurs se sont au fil du temps enrichis de mécanismes qui visent à contrôler le contenu d'une page Web. En particulier, il faut évoquer :
CORS avec Node.js
Du fait qu'il ne fallait pas casser le Web en instaurant ces mécanismes, ces derniers ne changent pas grand-chose pour le développeur d'une application Web standard, au sens d'un ensemble de pages servies par un même serveur, qui n'affichent jamais que du contenu qui en provient.
C'est tout particulièrement vrai pour CSP, qui ne vient pas limiter des pratiques telles comme par exemple du script inline dans une balise <script>, tant que le développeur ne met pas lui-même en place CSP en accompagnant ses pages d'un header Content-Security-Policy.
Il est va autrement pour SOP et CORS, qui d'emblée limitent des pratiques. En particulier, il est impossible depuis le script d'une page Web de formuler une requête via l'API Fetch pour récupérer du contenu dont l'origine, entendue comme la composition du nom de domaine et du numéro de port, n'est pas celle de la page en question.
Or cela peut être nécessaire. Illustration avec une application Web où l'utilisateur accède à une page servie par un serveur Node.js (module http) à l'écoute sur le port 3000 de localhost, dans laquelle un script récupère du contenu en appelant un service exposé par un autre serveur Node.js (module http) à l'écoute sur le port 3001 du même localhost.
Continuer la lecture de "CORS avec Node.js"
CORS avec Node.js

Hackflash #7 : Extraire les PNG et les JPEG d’un binaire (même partiels)

Lors d'un challenge de forensics, il arrive souvent d'avoir à extraire des informations d'un dump de la mémoire, un gros fichier binaire.
Evidemment, il existe des outils pour cela, et le plus simple est sans doute d'utiliser un bon vieux binwalk. Toutefois, il peut être nécessaire d'avoir le faire soi-même.
Extraire les PNG et les JPEG d'un binaire (même partiels)
La solution la plus simple est alors encore de rédiger un programme en Python.
Continuer la lecture de "Hackflash #7 : Extraire les PNG et les JPEG d’un binaire (même partiels)"
Hackflash #7 : Extraire les PNG et les JPEG d’un binaire (même partiels)

Hackflash #6 : Extraire les mots d’un dictionnaire d’un binaire

Lors d'un challenge de forensics, il arrive souvent d'avoir à extraire des informations d'un dump de la mémoire, un gros fichier binaire. En particulier des mots issus d'un dictionnaire.
Evidemment, il existe des outils pour cela, et le plus simple est sans doute d'utiliser un bon vieux grep -a. Toutefois, il peut être nécessaire d'avoir le faire soi-même.
Extraire le mots d'un dictionnaire d'un binaire en Python 3
La solution la plus simple est alors encore de rédiger un programme en Python.
Continuer la lecture de "Hackflash #6 : Extraire les mots d’un dictionnaire d’un binaire"
Hackflash #6 : Extraire les mots d’un dictionnaire d’un binaire

Chronique de l’IA #6

L'IA générative n'en finit pas de générer des initiatives dans tous les domaines, ce qui conduit les entrepreneurs à tester des limites qui ne sont pas seulement techniques, mais aussi éthiques.
Chronique de l'IA #6
Ainsi, est-il vraiment possible d'espérer que l'Artificial General Intelligence (AGI) surgisse sous le seul effet du gigantisme poussé toujours plus loin ? Est-il possible de mettre toujours plus prématurément sur le marché des produits qui intègrent l'IA en misant sur les retours des utilisateurs pour les finaliser ? Est-il raisonnable d'entreprendre de créer des robots toujours plus sophistiqués, pilotés par des IA qui restent encore à ce jour des boîtes noires ? Faut-il accepter que nos systèmes d'armement intègrent des IA toujours plus autonomes, au point que l'humain sorte de la boucle ?
NB : Ce billet a été rédigé début juin par un humain et non une boîte de conserve, et publié dans le numéro #264 de Programmez! de juillet 2024.
Continuer la lecture de "Chronique de l’IA #6"
Chronique de l’IA #6