30 July 2015

Carl Chenet

Liens intéressants Journal Du Hacker semaine #31

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter  ou sur Identi.ca

logo-journal-du-hacker

Pour cette 31ème semaine de 2015, 5 liens intéressants que vous avez peut-être ratés, relayés cette semaine par le Journal Du Hacker, votre source d’informations pour le Logiciel Libre francophone !

docker

owncloud

Pour ne plus rater aucun article de la communauté francophone, voici :

De plus le site web du Journal Du Hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !

Le Journal Du Hacker fonctionne de manière collaborative, grâce à la participation de ses membres. Rejoignez-nous pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets.

Et vous ? Qu’avez-vous pensé de ces articles ? N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal Du Hacker ou bien dans les commentaires de ce billet :)


30 July, 2015 10:00PM par Carl Chenet

28 July 2015

Carl Chenet

Vidéo de présentation de Backup Checker aux RMLL 2015

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter  ou sur Identi.ca

Pour ceux qui n’ont pas pu se rendre RMLL 2015 qui avaient lieu à Beauvais cette année, je vous propose la vidéo de présentation de Backup Checker en français que l’équipe des RMLL a réalisée.

Pour rappel, le but de cet outil est de détecter les corruptions, pertes, modifications accidentelles ou intentionnelles des données des archives que nous utilisons habituellement pour nos sauvegardes. Cette vérification s’assure que les archives conservées seront exploitables le jour où vous en aurez besoin.

rmll2015

Lien vers la vidéo de présentation de Backup Checker en français

La vidéo s’organise autour de 2 grands axes, à savoir « pourquoi faire des sauvegardes » puis « comment utiliser Backup Checker« . Les questions qui m’ont été posées en fin de présentation étaient également très pertinentes.

Si vous regardez la vidéo, n’hésitez pas à me communiquer vos conseils/remarques dans les commentaires de ce billet :)

 


28 July, 2015 10:00PM par Carl Chenet

13 July 2015

Raphaël Hertzog

Mes activités libres en juin 2015

Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour mes donateurs (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.

Debian LTS

Ce mois-ci ce sont 14,5 heures de travail sur Debian LTS qui ont été subventionnées. Elles ont été consacrées aux tâches suivantes :

  • Tri de vulnérabilités CVE : j’ai envoyé 24 commits vers le suiveur de sécurité. J’ai également mis en place une rotation avec d’autres contributeurs rémunérés. De cette manière, cette tâche ne repose plus uniquement sur moi ;
  • J’ai passé en revue une mise à jour de libapache-mod-jk et envoyé la DLA-240-1;
  • J’ai préparé et publié la DLA-257-1 concernant libwmf, corrigeant une vulnérabilité CVE ;
  • J’ai passé en revue une mise à jour de shibboleth-sp2 et envoyé la DLA-259-1. En raison de l’absence d’un environnement de tests adapté, les tests effectués ont été réduits au minimum ;
  • J’ai préparé et publié la DLA-260-1 concernant hostapd, corrigeant une vulnérabilité CVE ;
  • J’ai préparé et publié la DLA-261-1 concernant aptdaemon, corrigeant une vulnérabilité CVE ;
  • J’ai commencé à travailler à une demande d’amélioration pour tracker.debian.org : mettre en évidence les bogues ouverts affectant la sécurité des distributions stables est important pour attirer l’attention des mainteneurs de paquets. Quelque chose n’est affiché, à l’heure actuelle, que dans le cas où des problèmes affectent la sécurité d’unstable.

Autres travaux Debian

Distro Tracker J’ai corrigé quelques problèmes touchant le suiveur : l’accès SSL à l’interface SOAP du suiveur ne fonctionnait pas, ce qui était du à la manière dont les certificats SSL sont gérés sur les machines Debian (cf. le n°787410 pour plus de détails sur un problème similaire). Le tableau des bogues a également disparu pendant un moment (cf. le n°787163). J’ai enfin intégré plusieurs changements mineurs envoyés par Christophe Siraut et James McCoy.

Le Cahier de l’Administrateur Debian Après plusieurs échanges avec l’équipe debian-doc, nous sommes tombés d’accord sur le fait d’héberger une copie de mon livre (libre, au sens des DFSG) sur debian.org. Ceci afin qu’il soit mieux mis en avant auprès des visiteurs découvrant Debian. C’est par ici. J’ai quelque peu modifié le paquet officiel (en intégrant notamment toutes les traductions disponibles) afin de rendre cela possible.

Empaquetage J’ai envoyé deux nouvelles versions de publican vers unstable (4.3.0 et 4.3.1). Pour ce faire, j’ai du tricher en les compilant sur Stretch, à cause d’une erreur à la compilation dans unstable provoquée par une régression de libxml2 (cf. le n°766884). J’ai aussi corrigé deux petits bogues remontés pour ce paquet : un problème de licence mal documentée (bogue n°787993) ainsi qu’une demande de remplacement de la dépendance à perlmagick vers une dépendance à libimage-magick-perl (bogue n°789223).

J’ai également envoyé zim 0.63 et une nouvelle version de gnome-shell-timer pour la compatibilité avec GNOME 3.16. J’ai parrainé python-requirements-detector (cf. le n°789497) comme prérequis pour prospector (un paquet que j’ai demandé voilà quelques temps via le n°781165). Je me suis aussi occupé d’une mise à jour stable de python-reportlab (cf. le n°787806) à la demande d’un client.

Contributions liées à Kali Dans Kali, nous nous reposons beaucoup sur reprepro pour gérer notre archive. Cela nous réussit plutôt bien, mais nous avons identifié au fil du temps plusieurs problèmes ennuyeux. Je viens juste de remonter certains d’entre eux :

  • Il devrait être possible de garder des fichiers déréférencés pendant quelques jours avant de les supprimer (cf. le n°788105);
  • Il devrait être possible de cloner une distribution via une unique commande (cf. le n°788843);
  • Il devrait être possible de renommer une distribution via une unique commande (cf. le n°788846).

live-build est un autre outil important pour nous, et lorsque nous avons commencé à utiliser de nouveaux noms de code pour nos versions, nous avons re-découvert certains problèmes. Ce coup-ci nous avons soumis un rapport de bogue avec quelques suggestions pour le rendre plus générique (cf. le n°789800), et envoyé un petit correctif pour éviter une erreur « bête » lorsque la version est inconnue de live-build.

Travaux divers

Problème de prise en charge matérielle J’ai quelques soucis avec la détection, durant le boot de mon NUC d’Intel, de disques connectés en USB. En conséquence de quoi j’ai envoyé un rapport de bogue sur la liste de diffusion Linux USB. C’est un problème assez étrange, dans la mesure où mon NAS arrête de fonctionner après chaque redémarrage (et ce jusqu’à ce que je débranche/rebranche le boîtier USB externe).

Mes sites Internet Vous avez peut-être remarqué certains changements sur raphaelhertzog.com et raphaelhertzog.fr. J’ai déployé de nouveaux thèmes qui devraient être mieux adaptés au mobile, et mis en place un support décent du HTTPS, se basant sur des certificats gratuits de wosign.com (ceci en attendant que letsencrypt.org convienne pour un usage grand public). De même pour la page freexian.com hébergeant notre offre de parrainage pour Debian LTS.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in June 2015 contribuée par Weierstrass01.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

13 July, 2015 07:01AM par Raphaël Hertzog

01 July 2015

Tuxicoman

SteamOS continue d’être basé sur Debian

Valve réitère sa confiance dans Debian pour fournir la base du système d’exploitation pour ses consoles de jeu.

Steam OS 2.0 sera basé sur Debian 8.1 qui est la version stable actuelle du projet Debian.

C’est une bonne nouvelle pour Debian qui s’attire l’intérêt des ingénieurs de Valve pour l’améliorer ainsi que pour les Debianeux qui peuvent s’attendre à un bon support « out of the box » des jeux Steam sur Debian 8.

J'aime(9)Ferme-la !(0)

01 July, 2015 10:06AM par Tuxicoman

08 June 2015

Raphaël Hertzog

Mes activités libres en mai 2015

Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour mes donateurs (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.

Debian LTS

Ce mois-ci ce sont 10,25 heures de travail sur Debian LTS qui ont été subventionnées. Elles ont été consacrées aux tâches suivantes :

  • Tri de vulnérabilités CVE : j’ai poussé 28 commits vers le suiveur de sécurité;
  • J’ai passé en revue une mise à jour d’exactimage, ainsi qu’une autre d’imagemagick, préparées par leurs mainteneurs respectifs ;
  • J’ai préparé et publié la DLA-229-1 concernant libnokogiri-ruby, corrigeant une vulnérabilité CVE ;
  • J’ai préparé et publié la DLA-230-1 concernant eglibc, corrigeant une vulnérabilité CVE.

Travaux Debian divers

Suiveur de paquets. Les administrateurs système Debian ont mis à jour vers Jessie la machine hébergeant tracker.debian.org, et j’ai du m’occuper des effets de bords que cela a induit. Corriger la configuration Apache fut facile, mais DACS a cessé de fonctionner et j’ai du le désactiver (et donc casser l’authentification via sso.debian.org). Heureusement Enrico Zini et Martin Zobel-Helas ont débogué le problème et réactivé le service.

Parrainage. J’ai parrainé les uploads de dolibarr et de plusieurs modules tryton-modules-*, afin de pousser Tryton 3.6 dans Debian (j’ai également donné les droits de mainteneur Debian sur les nouveaux paquets introduits à Matthias Behrle, qui les maintient).

Travaux divers. J’ai discuté de multiples demandes d’améliorations avec Dmitry Smirnov concernant dh-linktree.

Empaquetage J’ai poussé une nouvelle version amont de cpputest. Je l’ai fait deux fois en réalité, car la première version échouait à certains tests (cf. n°784674). J’ai également créé le rapport n°784959 sur blhc, car j’ai relevé un signalement qui semblait être un faux-positif, mentionnant un drapeau de compilation manquant.

J’ai poussé Django 1.8 vers experimental. C’est une nouvelle version majeure, et elle devrait idéalement être envoyée vers sid après que les problèmes de dépendances inverses aient été remontés. Je doute que nous aurons le temps de faire cela…

J’ai commencé à travailler sur Publican 4.3.0, mais la suite de tests a échoué et ce n’est même pas la faute de Publican pour une fois. C’est apparemment un bogue dans libxml.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in May 2015 contribuée par Weierstrass01.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

08 June, 2015 07:04AM par Raphaël Hertzog

01 June 2015

Tuxicoman

Hotplug SATA sous linux

Je fais mes sauvegardes avec un disque dur branché directement en SATA. C’est plus rapide qu’avec l’USB.
Pour cela j’utilise la fonctionnalité de changement à chaud (sans redémarrage) des connexions SATA.

Au branchement du disque, il n’y a rien à faire, le disque est reconnu au branchement et il n’y a plus qu’à monter les partitions.

Avant de débrancher, il faut démonter les partitions. Cela synchronise l’écriture des données (ouf!). Ensuite, j’ai trouvé sur internet plusieurs commentaires conseillant de supprimer le disque du système avant de le débrancher. C’est sensé arrêter mécaniquement le disque et empêcher toute application d’y accéder :

#echo 1 > /sys/block/sdb/device/delete

Est-ce la « bonne » méthode?

Si vous avez de l’expérience sur le hotplug SATA, ca m’intéresse.

J'aime(0)Ferme-la !(0)

01 June, 2015 07:40AM par Tuxicoman

27 May 2015

Vincent Bernat

Correction sans redémarrage de la faille VENOM de QEMU

La faille CVE-2015-3456, aussi connue sous le nom VENOM, exploite une faiblesse dans l’implémentation du contrôleur de disquettes de QEMU:

Le contrôleur de disquettes (FDC) de QEMU, tel qu’utilisé dans Xen […] et dans KVM permet aux systèmes invités de provoquer un déni de service (écriture hors limite suivie du crash du processus invité) ou éventuellement d’exécuter du code arbitraire à travers les commandes FD_CMD_READ_ID, FD_​CMD_​DRIVE_​SPECIFICATION_​COMMAND ou d’autres commandes non spécifiées.

Même lorsque QEMU a été configuré pour ne pas exposer de lecteur de disquettes, le contrôleur est toujours actif. La vulnérabilité est facile à tester1 :

#define FDC_IOPORT 0x3f5
#define FD_CMD_READ_ID 0x0a

int main() {
    ioperm(FDC_IOPORT, 1, 1);
    outb(FD_CMD_READ_ID, FDC_IOPORT);
    for (size_t i = 0;; i++)
        outb(0x42, FDC_IOPORT);
    return 0;
}

Une fois le correctif installé, tous les processus doivent être redémarrés pour que la mise à jour prenne effet. Il est possible de minimiser le temps de coupure en utilisant virsh save.

Une alternative serait de modifier le processus en cours d’exécution. Le noyau Linux a suscité beaucoup d’intérêt dans ce domaine avec des solutions telles que Ksplice, kGraft et kpatch, ainsi que par l’inclusion d’une structure commune dans le noyau. L’espace utilisateur ne dispose cependant pas de solutions aussi élaborées2.

Je présente ici une solution simple et sans dépendance pour corriger une instance de QEMU en cours d’exécution. Voici une courte démonstration :

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="270" src="http://www.youtube-nocookie.com/embed/gTcWNIQwnV8?rel=0" width="480"></iframe>

Prototype

Essayons d’abord de trouver une modification simple à implémenter : bien qu’il soit possible de modifier du code en cours d’exécution, il est bien plus simple de modifier une variable.

Concept

En examinant le code du contrôleur de disquettes et le correctif, une façon d’éviter la vulnérabilité est de n’accepter aucune commande sur le port FIFO. Chaque requête aura comme réponse « Invalid command » (0x80). L’utilisateur ne pourra plus pousser aucun octet avant de lire la réponse, ce qui provoquera une remise à zéro de la queue FIFO. Bien sûr, le contrôleur de disquette deviendra alors inopérant.

La liste des commandes acceptées par le contrôleur sur le port FIFO se trouve dans le tableau handlers[] :

static const struct {
    uint8_t value;
    uint8_t mask;
    const char* name;
    int parameters;
    void (*handler)(FDCtrl *fdctrl, int direction);
    int direction;
} handlers[] = {
    { FD_CMD_READ, 0x1f, "READ", 8, fdctrl_start_transfer, FD_DIR_READ },
    { FD_CMD_WRITE, 0x3f, "WRITE", 8, fdctrl_start_transfer, FD_DIR_WRITE },
    /* [...] */
    { 0, 0, "unknown", 0, fdctrl_unimplemented }, /* default handler */
};

Pour éviter de parcourir ce tableau pour chaque commande reçue, un autre tableau associe une commande à la fonction adéquate :

/* Associate command to an index in the 'handlers' array */
static uint8_t command_to_handler[256];

static void fdctrl_realize_common(FDCtrl *fdctrl, Error **errp)
{
    int i, j;
    static int command_tables_inited = 0;

    /* Fill 'command_to_handler' lookup table */
    if (!command_tables_inited) {
        command_tables_inited = 1;
        for (i = ARRAY_SIZE(handlers) - 1; i >= 0; i--) {
            for (j = 0; j < sizeof(command_to_handler); j++) {
                if ((j & handlers[i].mask) == handlers[i].value) {
                    command_to_handler[j] = i;
                }
            }
        }
    }
    /* [...] */
}

Notre modification consiste à changer le tableau command_to_handler[] pour associer toutes les commandes à la fonction fdctrl_unimplemented() (celle en dernière position dans le tableau handlers[]).

Test avec gdb

Pour vérifier que cette modification fonctionne correctement, nous la testons avec gdb. À moins d’avoir compilé QEMU manuellement, il est nécessaire d’installer le paquet contenant les symboles de débogage. Malheureusement, chez Debian, ils ne sont pas encore3 disponibles. Chez Ubuntu, il suffit d’installer le paquet qemu-system-x86-dbgsym après avoir activé les dépôts appropriés.

La fonction suivante pour gdb implémente le correctif :

define patch
  set $handler = sizeof(handlers)/sizeof(*handlers)-1
  set $i = 0
  while ($i < 256)
   set variable command_to_handler[$i++] = $handler
  end
  printf "Done!\n"
end

Il suffit alors de s’attacher au processus vulnérable (avec attach), d’appeler cette fonction (avec patch) et de se détacher (avec detach). Cette procédure est simple à automatiser.

Limitations

L’usage de gdb comporte principalement deux limitations :

  1. gdb doit être installé sur toutes les machines à corriger.
  2. Les paquets de débogage doivent également être présents. Il est de plus difficile de récupérer d’anciennes versions de ceux-ci.

Industrialisation

Pour contourner ces limitations, nous allons écrire un programme utilisant l’appel système ptrace() et qui ne nécessite pas les symboles de débogage pour fonctionner.

Trouver l’emplacement mémoire

La première étape est de localiser le tableau command_to_handler[] en mémoire. Le premier indice se trouve dans la table des symboles que l’on peut interroger avec readelf -s :

$ readelf -s /usr/lib/debug/.build-id/09/95121eb46e2a4c13747ac2bad982829365c694.debug | \
>   sed -n -e 1,3p -e /command_to_handler/p

Symbol table '.symtab' contains 27066 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
  8485: 00000000009f9d00   256 OBJECT  LOCAL  DEFAULT   26 command_to_handler

Habituellement, cette table a été retirée pour économiser de l’espace disque, comme on peut le voir ci-dessous :

$ file -b /usr/bin/qemu-system-x86_64 | tr , \\n
ELF 64-bit LSB shared object
 x86-64
 version 1 (SYSV)
 dynamically linked
 interpreter /lib64/ld-linux-x86-64.so.2
 for GNU/Linux 2.6.32
 BuildID[sha1]=0995121eb46e2a4c13747ac2bad982829365c694
 stripped

Si votre distribution fournit un paquet de débogage, les symboles sont alors installés dans le répertoire /usr/lib/debug. La plupart des distributions modernes utilisent désormais le build ID4 pour lier un exécutable à ses symboles de débogage, comme c’est le cas dans l’exemple ci-dessus. Sans paquet de débogage, il est nécessaire de recompiler le paquet dans un environnement minimal5 sans supprimer les symboles. Sur Debian, cela peut se faire en affectant nostrip à la variable d’environnement DEB_BUILD_OPTIONS.

Il y a ensuite deux cas possibles :

  • le cas facile,
  • le cas difficile.

Le cas facile

Sur x86, la mémoire d’un processus Linux normal est organisée comme ceci6 :

Organisation mémoire d'un processus normal sur x86

L’espace aléatoire introduit entre les différentes zones (ASLR) permettent de rendre la tâche d’un attaquant plus difficile quand il veut référencer une fonction particulière. Sur x86-64, l’organisation est similaire. Le point important est que l’adresse de base de l’exécutable est fixe.

L’organisation mémoire d’un processus peut être consultée à travers le fichier /proc/PID/maps. Voici une version raccourcie et annotée sur x86-64 :

$ cat /proc/3609/maps
00400000-00401000         r-xp 00000000 fd:04 483  not-qemu [text segment]
00601000-00602000         r--p 00001000 fd:04 483  not-qemu [data segment]
00602000-00603000         rw-p 00002000 fd:04 483  not-qemu [BSS segment]
[random gap]
02419000-0293d000         rw-p 00000000 00:00 0    [heap]
[random gap]
7f0835543000-7f08356e2000 r-xp 00000000 fd:01 9319 /lib/x86_64-linux-gnu/libc-2.19.so
7f08356e2000-7f08358e2000 ---p 0019f000 fd:01 9319 /lib/x86_64-linux-gnu/libc-2.19.so
7f08358e2000-7f08358e6000 r--p 0019f000 fd:01 9319 /lib/x86_64-linux-gnu/libc-2.19.so
7f08358e6000-7f08358e8000 rw-p 001a3000 fd:01 9319 /lib/x86_64-linux-gnu/libc-2.19.so
7f08358e8000-7f08358ec000 rw-p 00000000 00:00 0
7f08358ec000-7f083590c000 r-xp 00000000 fd:01 5138 /lib/x86_64-linux-gnu/ld-2.19.so
7f0835aca000-7f0835acd000 rw-p 00000000 00:00 0
7f0835b08000-7f0835b0c000 rw-p 00000000 00:00 0
7f0835b0c000-7f0835b0d000 r--p 00020000 fd:01 5138 /lib/x86_64-linux-gnu/ld-2.19.so
7f0835b0d000-7f0835b0e000 rw-p 00021000 fd:01 5138 /lib/x86_64-linux-gnu/ld-2.19.so
7f0835b0e000-7f0835b0f000 rw-p 00000000 00:00 0
[random gap]
7ffdb0f85000-7ffdb0fa6000 rw-p 00000000 00:00 0    [stack]

Dans le cas d’un exécutable normal, le nombre fourni dans la table des symboles est une adresse absolue :

$ readelf -s not-qemu | \
>   sed -n -e 1,3p -e /command_to_handler/p

Symbol table '.dynsym' contains 9 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    47: 0000000000602080   256 OBJECT  LOCAL  DEFAULT   25 command_to_handler

Ainsi, dans l’exemple ci-dessus, l’adresse du tableau command_to_​handler[], est simplement 0x602080.

Le cas difficile

Pour améliorer la sécurité, il est possible de placer certains exécutables à un emplacement aléatoire en mémoire, comme c’est le cas pour une bibliothèque. Un tel exécutable est appelé un Position Independent Executable (PIE). Un attaquant ne pourra pas se baser sur une adresse fixe pour rebondir sur une fonction particulière. Voici à quoi ressemble l’organisation mémoire d’un processus dans ce cas :

Organisation mémoire d'un processus PIE sur x86

Dans le cas d’un processus PIE, le nombre indiqué dans la table des symboles est relatif à l’adresse de base du processus.

$ readelf -s not-qemu-pie | sed -n -e 1,3p -e /command_to_handler/p

Symbol table '.dynsym' contains 17 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    47: 0000000000202080   256 OBJECT  LOCAL  DEFAULT   25 command_to_handler

En regardant le contenu de /proc/PID/maps, il est possible de calculer l’emplacement mémoire du tableau :

$ cat /proc/12593/maps
7f6c13565000-7f6c13704000 r-xp 00000000 fd:01 9319  /lib/x86_64-linux-gnu/libc-2.19.so
7f6c13704000-7f6c13904000 ---p 0019f000 fd:01 9319  /lib/x86_64-linux-gnu/libc-2.19.so
7f6c13904000-7f6c13908000 r--p 0019f000 fd:01 9319  /lib/x86_64-linux-gnu/libc-2.19.so
7f6c13908000-7f6c1390a000 rw-p 001a3000 fd:01 9319  /lib/x86_64-linux-gnu/libc-2.19.so
7f6c1390a000-7f6c1390e000 rw-p 00000000 00:00 0
7f6c1390e000-7f6c1392e000 r-xp 00000000 fd:01 5138  /lib/x86_64-linux-gnu/ld-2.19.so
7f6c13b2e000-7f6c13b2f000 r--p 00020000 fd:01 5138  /lib/x86_64-linux-gnu/ld-2.19.so
7f6c13b2f000-7f6c13b30000 rw-p 00021000 fd:01 5138  /lib/x86_64-linux-gnu/ld-2.19.so
7f6c13b30000-7f6c13b31000 rw-p 00000000 00:00 0
7f6c13b31000-7f6c13b33000 r-xp 00000000 fd:04 4594  not-qemu-pie [text segment]
7f6c13cf0000-7f6c13cf3000 rw-p 00000000 00:00 0
7f6c13d2e000-7f6c13d32000 rw-p 00000000 00:00 0
7f6c13d32000-7f6c13d33000 r--p 00001000 fd:04 4594  not-qemu-pie [data segment]
7f6c13d33000-7f6c13d34000 rw-p 00002000 fd:04 4594  not-qemu-pie [BSS segment]
[random gap]
7f6c15c46000-7f6c15c67000 rw-p 00000000 00:00 0     [heap]
[random gap]
7ffe823b0000-7ffe823d1000 rw-p 00000000 00:00 0     [stack]

L’adresse de base est 0x7f6c13b31000, le décalage relatif est 0x202080 et donc le tableau se trouve à l’adresse mémoire 0x7f6c13d33080. Il est possible de vérifier cette valeur avec gdb : with gdb:

$ print &command_to_handler
$1 = (uint8_t (*)[256]) 0x7f6c13d33080 <command_to_handler>

Modifier un emplacement mémoire

Une fois l’emplacement du tableau command_to_handler[] connu, le modifier est relativement simple. Il convient d’abord de s’attacher au processus cible :

/* Attach to the running process */
static int
patch_attach(pid_t pid)
{
    int status;

    printf("[.] Attaching to PID %d...\n", pid);
    if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
        fprintf(stderr, "[!] Unable to attach to PID %d: %m\n", pid);
        return -1;
    }

    if (waitpid(pid, &status, 0) == -1) {
        fprintf(stderr, "[!] Error while attaching to PID %d: %m\n", pid);
        return -1;
    }
    assert(WIFSTOPPED(status)); /* Tracee may have died */

    if (ptrace(PTRACE_GETSIGINFO, pid, NULL, &si) == -1) {
        fprintf(stderr, "[!] Unable to read siginfo for PID %d: %m\n", pid);
        return -1;
    }
    assert(si.si_signo == SIGSTOP); /* Other signals may have been received */

    printf("[*] Successfully attached to PID %d\n", pid);
    return 0;
}

Ensuite, récupérons le tableau command_to_handler[], modifions le et réécrivons le en mémoire7.

static int
patch_doit(pid_t pid, unsigned char *target)
{
    int ret = -1;
    unsigned char *command_to_handler = NULL;
    size_t i;

    /* Get the table */
    printf("[.] Retrieving command_to_handler table...\n");
    command_to_handler = ptrace_read(pid,
                                     target,
                                     QEMU_COMMAND_TO_HANDLER_SIZE);
    if (command_to_handler == NULL) {
        fprintf(stderr, "[!] Unable to read command_to_handler table: %m\n");
        goto out;
    }

    /* Check if the table has already been patched. */
    /* [...] */

    /* Patch it */
    printf("[.] Patching QEMU...\n");
    for (i = 0; i < QEMU_COMMAND_TO_HANDLER_SIZE; i++) {
        command_to_handler[i] = QEMU_NOT_IMPLEMENTED_HANDLER;
    }
    if (ptrace_write(pid, target, command_to_handler,
           QEMU_COMMAND_TO_HANDLER_SIZE) == -1) {
        fprintf(stderr, "[!] Unable to patch command_to_handler table: %m\n");
        goto out;
    }
    printf("[*] QEMU successfully patched!\n");
    ret = 0;

out:
    free(command_to_handler);
    return ret;
}

Comme ptrace() ne permet de lire et d’écrire qu’un mot à la fois, ptrace_read() et ptrace_write() sont des enrobages pour lire et écrire une quantité arbitraire de mémoire. Voici par exemple le code de ptrace_read() :

/* Read memory of the given process */
static void *
ptrace_read(pid_t pid, void *address, size_t size)
{
    /* Allocate the buffer */
    uword_t *buffer = malloc((size/sizeof(uword_t) + 1)*sizeof(uword_t));
    if (!buffer) return NULL;

    /* Read word by word */
    size_t readsz = 0;
    do {
        errno = 0;
        if ((buffer[readsz/sizeof(uword_t)] =
                ptrace(PTRACE_PEEKTEXT, pid,
                       (unsigned char*)address + readsz,
                       0)) && errno) {
            fprintf(stderr, "[!] Unable to peek one word at address %p: %m\n",
                    (unsigned char *)address + readsz);
            free(buffer);
            return NULL;
        }
        readsz += sizeof(uword_t);
    } while (readsz < size);
    return (unsigned char *)buffer;
}

Assembler les morceaux

Le programme prend en paramètre :

  • le PID du processus à modifier,
  • le décalage issu de la table des symboles pour le tableau command_to_handler[],
  • le build ID de l’exécutable utilisé pour obtenir ce décalage (à des fins de sécurité).

Les principales étapes sont alors les suivantes :

  1. S’Attacher au processus avec ptrace().
  2. Obtenir le nom de l’exécutable depuis /proc/PID/exe.
  3. Lire le fichier /proc/PID/maps afin de trouver l’adresse de base.
  4. Effectuer certaines vérifications supplémentaires:
    • vérifier qu’il y a bien un entête ELF à l’adresse de base (via quatre octets magiques),
    • vérifier le type de l’exécutable (ET_EXEC pour les exécutables normaux, ET_DYN pour les PIE),
    • récupérer et comparer le build ID avec celui attendu.
  5. À partir de l’adresse de base et du décalage fourni, calculer l’emplacement du tableau command_to_handler[].
  6. Modifier le tableau.

Les sources du programme sont disponibles sur GitHub.

$ ./patch --build-id 0995121eb46e2a4c13747ac2bad982829365c694 \
>         --offset 9f9d00 \
>         --pid 16833
[.] Attaching to PID 16833...
[*] Successfully attached to PID 16833
[*] Executable name is /usr/bin/qemu-system-x86_64
[*] Base address is 0x7f7eea912000
[*] Both build IDs match
[.] Retrieving command_to_handler table...
[.] Patching QEMU...
[*] QEMU successfully patched!

  1. Le code complet pour ce test est disponible sur GitHub

  2. Un projet qui semble intéressant est Katana. Mais il existe aussi un quelques papiers perspicaces sur le sujet. 

  3. Certains paquets fournissent également un paquet -dbg contenant les symboles de débogage. D’autres non. Une initiative pour produire automatiquement des paquets de débogage est actuellement en cours. 

  4. Le wiki de Fedora explique les raisons derrière cette décision

  5. Si la construction ne se fait pas à l’identique du paquet original, les build ID seront différents. L’information fournie par les symboles de débogage peut alors être ou non correcte. Une initiative pour s’assurer de la reproductabilité de la construction de tous les paquets est en cours. 

  6. « Anatomy of a program in memory » explique plus en détail cette organisation. 

  7. En étant une variable statique non initialisée, la variable se situe dans la section BSS qui se retrouve accessible en écriture en mémoire. Si ce n’était pas le cas, sous Linux, l’appel système ptrace() permet tout de même d’écrire dessus. Linux va copier la page correspondante et la marquer comme privée. 

27 May, 2015 03:52PM par Vincent Bernat

19 May 2015

Olivier Berger (pro)

Présentation du projet Debian par Nicolas Dandrimont lors de la Debian release party de Jessie

Nicolas (olasd) Dandrimont est venu présenter le projet Debian à Télécom SudParis lundi 18 mai 2015, pour la petite fête de sortie de la version majeure “Jessie” que nous avions organisé avec MiNET.

Les transparents de Nicolas sont disponibles sur son site.

Updated : Voici l’enregistrement de la conférence sur YouTube :
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="https://www.youtube.com/embed/d97A6mMKyuA" width="560"></iframe>

Merci aux membres de MiNET qui ont joyeusement participé à cette petite fête.

Voici quelques photos :




Vous pouvez aussi revisionner l’enregistrement de la conférence de Stefano il y a 4 ans.

19 May, 2015 02:52PM par Olivier Berger

13 May 2015

Olivier Berger (pro)

Avec MiNET, première Debian release party française de Jessie le 18 mai à Télécom SudParis

Vous étiez frustrés de ne pas pouvoir fêter Jessie en France dignement ?

On a pensé à vous, avec MiNET.

Le 18 mai entre 17h et 18h30, nous fêterons ça à Évry (Essonne) à Télécom SudParis, avec la participation de Nicolas Dandrimont en guest star, pour présenter le projet.

Attention, inscription gratuite par avance en contactant les organisateurs, compte-tenu des contraintes de sécurité pour l’accès au site (vigipirate).

Plus de détails sur : https://wiki.debian.org/ReleasePartyJessie/France/Évry

13 May, 2015 01:23PM par Olivier Berger

06 May 2015

Tuxicoman

Synthèse vocale sous linux

Je voulais faire parler mon ordinateur, je me suis penché sur les synthétiseurs vocaux et le mieux que j’ai pu trouver en libre et sous Linux, pour le français, c’est espeak + mbrola.

Les paquets à installer sur Debian :

# apt-get install espeak mbrola mbrola-fr4

Et ensuite, pour l’utiliser:

$ espeak -v mb/mb-fr4 -s 120 "Bonjour, je parle le français aussi bien que vous. Ou presque."

Certains aiment aussi pico2wave :

$ pico2wave -l fr-FR -w test.wav "Bonjour, je parle le français aussi bien que vous. Ou presque."

Pour l’anglais, le paquet festival donne de bons résultats.

$ echo "That's really a pity I'm not able to speak French"  | festival --tts

Mais cela reste loin de la concurrence propriétaire. Allez jeter une oreille sur ce que fait Acapela

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="363" src="https://www.youtube.com/embed/MS0hw9kl6w0?feature=oembed" width="646"></iframe>

J'aime(4)Ferme-la !(1)

06 May, 2015 05:51AM par Tuxicoman

03 May 2015

Stéphane Blondon

Colorer une sortie dans un terminal : highlight, pygmentize et ccze

highlight et pygmentize servent à colorer du code source, ccze à colorer des logs.

Affichage de la sortie de cat, highlight et pygmentize

Pour utiliser ces outils, voici les paquets à installer sur une distribution Debian ou dérivée :

commande paquet
highlight highlight
pygmentize python-pygments ou python3-pygments
ccze ccze

highlight et pygmentize

De nombreux langages disponibles

La liste des langages disponibles pour les deux outils est longue comme un jour sans compilation :
highlight colore 159 langages selon sa documentation.
pygmentize en colore 235 d’après un grep Lexer$ sur le texte de la page listant les lexeurs disponibles.

Plutôt que de tous les lister, voici un comparatif sur les 20 langages ayant le plus de lignes de code dans Jessie (la nouvelle version stable de Debian).

  1. C : les deux
  2. C++ : les deux
  3. Java : les deux
  4. XML : les deux
  5. sh : les deux
  6. Python : les deux. pygmentize a plusieurs lexeurs (python 2, python3, sortie console et la pile d’erreurs).
  7. Perl : les deux
  8. Lisp : les deux
  9. Asm : les deux. highlight colore aussi l’assembleur PowerPC.
  10. Fortran : highlight traite spécifiquement fortran77, pas pygmentize (qui gère la version 90).
  11. C# : les deux
  12. PHP : les deux
  13. Fortran90 : les deux
  14. Pascal : les deux. pygmentize nécessite d’utiliser Delphi lexer, avec option spécifique.
  15. Makefile : highlight (make, QMake), pygmentize (Makefile, CMake)
  16. Ruby : les deux. pygmentize colore le langage mais aussi la sortie console.
  17. SQL : highlight (MSSQL, SPIN SQL, PL/SQL, Sybase), pygmentize (MySQL, PgSQL, PL/PgSQL, console Postgres, SQL, console Sqlite)
  18. ML : les deux (Standard ML ainsi qu’Ocaml)
  19. Tcl : les deux

À cette liste, voici le comparatif sur les 20 premiers langages selon l’indice TIOBE en mars 2015 (sans juger de l’intérêt profond du classement en lui-même, ou son absence) :

  1. C : cf. liste précédente
  2. Java : cf. liste précédente
  3. Objective-C : les deux
  4. C++ : cf. liste précédente
  5. C# : cf. liste précédente
  6. PHP : cf. liste précédente
  7. JavaScript : les deux
  8. Python : cf. liste précédente
  9. Visual Basic .NET : ? (je ne connais pas les environnements Microsoft donc j’ai tout mis à la ligne suivante)
  10. Visual Basic : highlight colore les fichiers avec les extensions de fichiers .bas, .basic, .bi et .vbs. pygmentize colore ceux en .vb et .bas.
  11. F# : les deux
  12. Perl : cf. liste précédente
  13. Delphi/Object Pascal : pyg
  14. Transact-SQL : aucun des deux
  15. Pascal : cf. liste précédente
  16. ABAP : les deux
  17. PL/SQL : highlight uniquement
  18. Ruby : cf. liste précédente
  19. MATLAB : les deux. pygmentize colore le langage et la sortie console.
  20. R : les deux. pygmentize colore le langage (avec SLexer, ce n’est pas intuitif), la sortie console et la documentation.

pygmentize et highlight permettent la coloration syntaxique de nombreux autres langages comme Applescript, Awk, Bbcode, Clojure, Haxe, Lua et bien d’autres.

Les fichiers de configuration d’Apache sont colorés par les deux outils. pygmentize colore aussi la configuration de Lighttpd et Nginx mais aussi d’autres fichiers de configuration comme Docker ou CFEngine.

Contrairement à highlight, pygmentize permet aussi de colorer des logs IRC, les fichiers CMake ou du code spécifique aux moteurs de template (django, smarty, mako, genshi, erb).

hightlight colore COBOL ou graphviz, pas pygmentize.

Facile à utiliser

Les deux outils sont triviaux à installer. L’usage est facile aussi car ils déterminent le lexeur à utiliser en fonction de l’extension du fichier. Il est possible de forcer l’utilisation d’un lexeur (utile si les données viennent d’un pipe par exemple).

Par contre (et par défaut), highlight sort la coloration en html et non pour la console. Ce qui oblige à préciser la sortie terminal souhaitée. Il y en a deux possibles : ansi (16 couleurs) et term256 (256 couleurs). Ansi serait-il à réserver aux plus nostalgiques ? Ce choix cornélien s’impose aussi avec pygmentize (sortie par défaut contre console256).
Dans les faits, les différences ont peu d’intérêt.

highlight et pygmentize, période ansi et période 256 couleurs

Colorer de nouveaux langages

Les deux outils permettent d’ajouter de nouveaux lexeurs :
– en Lua pour highlight
– en Python pour pygmentize (qui est lui-même écrit en Python)

Autres usages

highlight et pygmentize permettent d’avoir d’autres sorties :

sorties highlight pygmentize
HTML oui oui
XHTML oui non
SVG oui oui
RTF oui oui
ODT oui non
Images bitmap non oui (bmp, gif, jpeg et png)

highlight est compatible avec source-highlight du projet GNU (outil que je n’ai jamais testé).

Que choisir ?

Si vous avez besoin d’un langage qui est disponible que sur l’un des deux outils, choisissez celui-là.
Si vous comptez écrire des greffons pour ajouter des langages, choisissez si vous préférez écrire en Lua ou en Python.
Si les deux règles précédentes ne permettent pas d’emporter la décision, je conseillerai plutôt pygmentize qui a plus de langages et qui gère des trucs plus récents (les moteurs de template par exemple). Évidemment, si c’est pour maintenir du code COBOL sur une base logicielle de 15 ans d’âge, ça ne sera pas très déterminant non plus…

ccze

ccze n’est pas concurrent des deux outils précédents car il colore des journaux, pas du code.

Affichage de la sortie de cat et ccze

Les remarques et usages de http://www.quennec.fr/gnulinux/utilisation/afficher-les-logs-en-couleur sur ccze sont valides. Cependant j’ai dû activer le mode ansi (avec -A ou --raw-ansi ou bien -m ansi ou encore --mode ansi) lors de mes tests, sinon il n’y avait aucune sortie dans le terminal.

Les journaux d’Apache, Exim, Postfix, syslog sont colorés par ccze. Pour la liste complète, man ccze.

Il est aussi possible d’ajouter de nouveaux type de journaux. Par contre, il faudra les écrire en C (cf. man ccze-plugin).

Fin : références, versions des logiciels

Les statistiques Debian concernant les langages sont issues de http://sources.debian.net/stats/. Pour en savoir plus, voir aussi http://sources.debian.net/doc/ (en particulier « Debsources: Live and Historical Views on Macro-Level »).

La page des lexers de pygmentize est /usr/share/doc/python-pygments-doc/html/docs/lexers.html sur Jessie (en supposant que python-pygments-doc est installé). L’emplacement était /usr/share/doc/python-pygments/lexers.html sur Wheezy (la version stable précédente) et était directement incluse dans le paquet python-pygments.

Les versions utilisées pour l’article :

stephane@foehn:~$ pygmentize -V
Pygments version 2.0.1, (c) 2006-2014 by Georg Brandl.
stephane@foehn:~$ highlight --version

 highlight version 3.18
 Copyright (C) 2002-2013 Andre Simon <andre.simon1 at gmx.de>

 Argparser class
 Copyright (C) 2006-2008 Antonio Diaz Diaz <ant_diaz at teleline.es>

 Artistic Style Classes (2.04)
 Copyright (C) 2006-2013 by Jim Pattee <jimp03 at email.com>
 Copyright (C) 1998-2002 by Tal Davidson

 Diluculum Lua wrapper (1.0)
 Copyright (C) 2005-2013 by Leandro Motta Barros

 xterm 256 color matching functions
 Copyright (C) 2006 Wolfgang Frisch <wf at frexx.de>

 This software is released under the terms of the GNU General Public License.
 For more information about these matters, see the file named COPYING.

stephane@foehn:~$ ccze --version
ccze 0.2.1

03 May, 2015 11:25AM par ascendances

16 April 2015

Tanguy Ortolo

Vote obligatoire ? Messieurs les députés, passez les premiers.

Contexte

Hier 15 avril 2015, le président de l'Assemblée nationale Claude Bartolone remettait au président de la République François Hollande un rapport préconisant de rendre le vote obligatoire pour toutes les élections impliquant les citoyens français.

Hier toujours, contre l'avis de plein de gens concernés — des organisations de défense des droits de l'homme, des associations diverses, des professionnels de l'Internet, des citoyens, un juge antiterroriste… — les députés français ont adopté à une majorité de 83% un article de loi instaurant la possibilité pour le pouvoir exécutif d'installer des dispositifs automatiques d'interception de trafic chez les opérateurs réseau sans contrôle judiciaire. Soit à peu près ce que la NSA faisait aux États-Unis, sauf qu'en France, ce sera légal.

Commentaire

Le rapport entre ces deux événements ? L'article de loi instaurant une possibilité de surveillance généralisée a été adopté par 30 députés présents, sur les 577 constituant l'Assemblée nationale. Vous voyez le rapport ? Nos députés brillent par un taux d’abstention de 94% pour le vote d'un article de loi connu pour rencontrer une opposition significative dans la société, et bien assez médiatisé pour qu'ils en soient conscients. Quatre-vingt quatorze pour cents d’abstention. Permettez-moi de le répéter tellement c'est ahurissant : quatre-vingt quatorze pour cents d'abstention, un chiffre qui pulvérise les pires records des élections impliquant les citoyens français, confortant l'Assemblée nationale à son titre de honte de la République.

Ces deux cas ne sont toutefois pas tout à fait comparables. En effet, alors que les citoyens ont un droit de vote, leur devoir de voter fait depuis longtemps l'objet d'un débat. En revanche, en ce qui concerne les députés, il n'y a pas de doute possible : ces individus se sont portés volontaires, ont été élus, et sont payés pour élaborer les lois ; être au minimum présents pour les adopter ou les rejeter est donc un devoir moral et professionnel, dont ils doivent rendre compte devant le peuple français.

Mesdames et Messieurs les députés, vous passez déjà pour des nantis, pour des branleurs fainéants et pour des godillots. Certaines de vos séances font ressembler l'hémicycle à une cour de récréation d'école primaire. Remerciez donc Monsieur Bartolone d'ajouter l'hypocrisie à la longue liste des offenses que vous infligez au peuple français par votre pitoyable attitude.

Recommandations

Monsieur le président Bartolone a remis à Monsieur le président Hollande son rapport recommandant le vote obligatoire. Par son hypocrisie, ce texte est une insulte au peuple français. En réponse à ce rapport, voici le mien, qui sera bref. Avant d'envisager de rendre le vote obligatoire en France, au nom de l'exemplarité des institutions de la République française, je recommande d'introduire et de faire respecter une obligation de vote à l'Assemblée nationale, par les mesures suivantes :

  1. paiement des députés au prorata de leur présence à l'Assemblée nationale, ceci étant appliqué à l'ensemble des flux financier entrants pour un député, incluant son indemnité, ses frais de mandats, de déplacement, de personnel et ainsi de suite, étant entendu qu'un sous-député député travaillant à temps partiel doit pouvoir se satisfaire d'un secrétaire à temps temps partiel et que ses frais annexes n'ont pas vocation à pour compenser ou amortir le coût de ses manquements ;
  2. considérer un absentéisme injustifié et excessif comme un abandon de poste, donnant lieu à des sanctions disciplinaires telles que des travaux d'intérêt généraux, réalisés à Paris de façon à forcer ces députés à être en mesure de se rendre à l'Assemblée ;
  3. considérer un absentéisme répété comme une faute professionnelle, donnant lieu à une radiation de l'Assemblée, sans indemnisation aucune, déclenchant une élection législative partielle dans la circonscription concernée ; cette radiation pourrait être accompagnée d'une inéligibilité temporaire, l'attitude irresponsable de ces politiciens étant nuisibles à la démocratie.

16 April, 2015 05:06PM par Tanguy

15 April 2015

Florent Gallaire

Neil McGovern élu DPL pour 2015

C’est Neil McGovern qui vient d’être élu Debian Project Leader (DPL) pour l’année 2015, succédant ainsi au double mandat de Lucas Nussbaum, contre qui il avait perdu en 2014.

Neil McGovern

Neil devance Mehdi Dogguy, qui recueille un nombre de voix très intéressant pour l’avenir, et Gergely Nagy (déjà candidat malheureux en 2004, 2012 et 2013). Voici une représentation du résultat du scrutin qui utilise la méthode Condorcet :

Vote DPL 2015

Bravo à toi Neil, et bonne chance dans la mise en œuvre de ton programme !

15 April, 2015 01:09AM par fgallaire

01 April 2015

Debian France

Debian France a un nouveau Président

Suite à l'Assemblée Générale Ordinaire tenue le mois dernier, le Conseil d'Administration de Debian France a élu un nouveau Président: bienvenue à Nicolas Dandrimont (alias olasd) !

Le président précédent, Raphaël Hertzog, reste dans le Conseil d'Administration pour assurer la transition. Sylvestre Ledru reste trésorier et Julien Cristau est reconduit pour un nouveau mandat au Conseil d'Administration. Julien Danjou quitte l'équipe après plusieurs années de bons et loyaux services.

Un grand merci à tous les candidats au Conseil d'Administration, nous comptons sur eux pour aussi dynamiser l'association dans les années à venir: - François-Régis Vuillemin - Michel Barret - Sébatien Poher

01 April, 2015 04:14PM

20 March 2015

Florent Gallaire

Quel DPL pour 2015 ?

Le temps passe vite, et cela fait déjà presque un an que Lucas Nussbaum a été réélu Debian Project Leader (DPL). Chaque développeur Debian pouvait donc se porter candidat entre le 4 et le 10 mars à la suite du traditionnel appel à candidatures.

Dès le 12 février, anticipant quelque peu sur le calendrier, Lucas avait exprimé le souhait de ne pas se représenter :

But I also think that switching release cycles is a good opportunity to align other changes, and starting a fresh release cycle with a fresh DPL might be a good idea. Put differently: no, I will not run for re-election.

Il y aura finalement cette année trois candidats :

Les presque mille développeurs Debian seront libres de faire leur choix du 1er au 14 avril lors d’un vote utilisant la méthode Condorcet.

Vous pouvez retrouver tous les débats de la campagne sur la mailing list debian-vote.

20 March, 2015 10:51AM par fgallaire

06 March 2015

Tanguy Ortolo

Un vrai livre n'est pas verrouillé : #thatisnotabook

Fondation, d'Isaac Asimov, chez Folio SF

Ceci est un livre. Je peux en faire ce que je veux, le prêter, le copier pour mon usage privé. Personne ne peut m'empêcher de le faire ou me le retirer. Ceci est une livre, soumis à une TVA réduite.


Deux fichiers EPUB

Ceci est un livre, enfin deux. Je peux en faire ce que je veux, les prêter, les copier pour mon usage privé, en particulier les sauvegarder sur mon ordinateur pour ne pas le perdre si ma liseuse tombe en panne, ou les imprimer pour les lire sans appareil électronique. Personne ne peut m'empêcher de le faire ou me les retirer. Ceci est un livre, qui devrait être soumis à une TVA réduite.


Un fichier verrouillé ACSM

Ceci n'est pas un livre. Je ne peux pas le lire sur tous les appareils que je veux, à vrai dire je ne peux pas le lire du tout, puisqu'il faut un logiciel qui n'est pas disponible pour mon système d'exploitation. Je ne peux pas le prêter. Je ne peux pas le copier pour mon usage privé. Adobe peut me le retirer à distance. Il deviendra illisible le jour où les serveurs dédiés à cela seront arrêtés — notez qu'il s'agit d'un futur et non d'un conditionnel, d'une certitude et non d'une hypothèse. Ceci n'est pas un livre, c'est un droit temporaire de lecture sous conditions, une location à durée indéfinie, bref, un service, qui doit être soumis à une TVA pleine.

06 March, 2015 05:54PM par Tanguy

23 January 2015

Debian France

Présentation du projet Debian aux Expériences Numériques

Expériences Numériques

Les EPN de la Maison pour Tous Salle des Rancy en collaboration avec l'Aadn, Aldil, Ubunteros de Lyon, Illyse organisent le 31 janvier 2015 : les Expériences Numeriques.

Ce rendez-vous est une journée de découverte, d’initiation et de rencontres autour des pratiques du numérique.

À cette occasion une conférence aura lieu à 16h pour présenter le projet Debian. Pendant cette journée une install party sera organisée où les personnes qui le désirent pourront installer notre distribution favorite.

Télécharger le programme.

Carte Openstreet Map. Voir aussi le plan d'accès officiel pour plus de détails.

logo Maison pour Tous Salle des Rancy

23 January, 2015 03:12PM

02 January 2015

Philippe Latu

Raspbian & IPv6

Voilà maintenant plus d'un an que j'utilise un système Raspberry Pi comme routeur IPv6 entre le réseau local domestique et l'Internet via un tunnel SixXS. Je suis vraiment satisfait de cette solution qui permet d'agréger les services d'une «box» opérateur à moindre coût en plus de la fonction de routage. De mon point de vue, l'utilisation du système d'exploitation Raspbian s'imposait naturellement.

En configurant une nouvelle carte Raspberry Pi B+, j'ai redécouvert le fait que le protocole IPv6 n'est pas activé par défaut sur le système. C'est vraiment dommage dans un contexte où l'objet «Raspberry Pi B+» doit être nécessairement raccordé à l'Internet. En effet, il est particulièrement intéressant de pouvoir accéder via SSH à la carte sans avoir enregistré quoi que ce soit dans les services DHCP et DNS. L'autoconfiguration IPv6 prend tout son sens dans ce contexte.

Étape 1 : activer IPv6

Sur un système Raspbian fraichement installé, le support du protocole IPv6 n'est pas activé. Il apparaît que le protocole a été compilé sous forme de module dans le noyau de la distribution. La première manipulation à faire consiste donc à activer le chargement du module.

Les options de chargement des modules sont contrôlées via les fichiers placés dans le répertoire /etc/modprobe.d. Dans ce répertoire, on trouve un fichier ipv6.conf dont le contenu est le suivant :

# Don't load ipv6 by default
alias net-pf-10 off
#alias ipv6 off

Il suffit de commenter la ligne en rouge qui désactive la famille de protocole numéro 10 dans le noyau Linux et de redémarrer le système pour bénéficier du support IPv6. Le contenu du fichier devient :

# Don't load ipv6 by default
#alias net-pf-10 off
#alias ipv6 off

Une fois le redémarrage achevé, le module ipv6 est automatiquement chargé en mémoire.

$ lsmod | egrep -e '(Module|ipv6)'
Module                  Size  Used by
ipv6                  316254  22

Là, il faut bien reconnaître que c'est le module ipv6 qui occupe le plus de mémoire dans la liste complète des modules chargés en mémoire.

Il est maintenant possible d'accéder à la carte via SSH en utilisant les adresses de type lien local.

pi@raspberrypi ~ $ ip addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:82:b2:64 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::ba27:ebff:fe82:b264/64 scope link
       valid_lft forever preferred_lft forever

Une adresse de type lien local appartient au préfixe fe80::/10 et est composée automatiquement à partir de l'adresse MAC au format EUI-64. Dans l'exemple ci-dessus, on reconnaît l'insertion des deux octets ff:fe au milieu de l'adresse MAC d'origine qui apparaît sur la ligne au-dessus.

L'accès SSH à l'aide de l'adresse de type lien local se fait comme suit :

phil@myhostname:~$ ssh pi@fe80::ba27:ebff:fe82:b264%eth0
pi@fe80::ba27:ebff:fe82:b264%eth0's password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 15:49:24 2015 from fe80::226:18ff:fe27:7b9%eth0

La seule particularité de cet accès tient au fait qu'il est nécessaire de désigner l'interface du domaine de diffusion à utiliser. Ici, la notation %eth0 impose l'utilisation du réseau Ethernet sur lequel l'interface eth0 est raccordée.

Étape 2 : autoconfiguration IPv6

Si l'étape précédente ne nécessite aucun service d'infrastructure, l'affectation d'une adresse IPv6 visible sur l'Internet suppose qu'un routeur IPv6 déjà configuré se charge de l'attribution des paramètres de l'interface réseau. Sur le système Raspbian, il faut ajouter deux lignes au fichier /etc/network/interfaces.

auto lo

iface lo inet loopback
iface eth0 inet dhcp
iface eth0 inet6 auto

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
iface default inet6 auto

Après réinitialisation de l'interface active à l'aide des commandes sudo ifdown eth0 et sudo ifup eth0, l'autoconfiguration IPv6 peut s'effectuer. On visualise ci-dessous les adresses ainsi que la table de routage.

$ ip -6 addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:fe00:814f:ba27:ebff:fe82:b264/64 scope global dynamic
       valid_lft 86368sec preferred_lft 14368sec
    inet6 fe80::ba27:ebff:fe82:b264/64 scope link
       valid_lft forever preferred_lft forever
$ ip -6 ro ls
2001:db8:fe00:814f::/64 dev eth0  proto kernel  metric 256  expires 86251sec
fe80::/64 dev eth0  proto kernel  metric 256 
default via fe80::ba27:ebff:feea:2972 dev eth0  proto ra  metric 1024  expires 1651sec

Pour compléter l'autoconfiguration, on ajoute le traitement des annonces RDNSS qui va servir à configurer le resolver DNS.

$ sudo aptitude install rdnssd
Les NOUVEAUX paquets suivants vont être installés : 
  rdnssd resolvconf{a}

On relève le résultat dans le fichier /etc/resolv.conf après réinitialisation de l'interface active.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 2001:db8:fe00:814f::1
search mydomain

Étape 3 : multicast DNS

Pour terminer, on ajoute le service multicast DNS au système. Manipuler des adresses IPv6 sous forme numérique peut s'avérer très fastidieux. Alors pourquoi ne pas bénéficier d'une résolution des noms d'hôtes sans passer par les enregistrements DNS «classiques» ?

On installe deux paquets supplémentaires ainsi que les dépendances associées.

$ sudo aptitude install avahi-daemon avahi-utils
Les NOUVEAUX paquets suivants vont être installés : 
  avahi-daemon avahi-utils bind9-host{a} libavahi-core7{a} libbind9-80{a} libdns88{a} libisc84{a} libisccc80{a} libisccfg82{a} liblwres80{a} libnss-mdns{a} 
0 paquets mis à jour, 11 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 1 420 ko d'archives. Après dépaquetage, 3 360 ko seront utilisés.

Une fois les paquets installés, il reste une ultime édition de fichier. La recherche de noms mdns ne doit pas être restreinte au seul protocole IPv4. On modifie donc le fichier /etc/nsswicth.conf comme ci-dessous.

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns_minimal [NOTFOUND=return] dns mdns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Sur la ligne en vert ci-dessus, on a retiré les chiffres 4 pour les paramètres mdns.

Et voilà !

On accède maintenant à notre objet de l'Internet via son nom dans le Top Level Domain .local.

$ ssh pi@raspberrypi.local
The authenticity of host 'raspberrypi.local (2a01:240:fe00:814f:ba27:ebff:fe82:b264)' can't be established.
ECDSA key fingerprint is 4f:f9:17:ba:bf:57:16:a9:64:12:b7:e0:2b:51:7d:26.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'raspberrypi.local,2a01:240:fe00:814f:ba27:ebff:fe82:b264' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 18:32:25 2015 from fe80::226:18ff:fe27:7b9%eth0

pour conclure, même si les configurations proposées dans ce billet ont une empreinte mémoire non nulle, je dirai qu'elles facilitent beaucoup l'utilisation de la connexion réseau sans qu'il soit nécessaire de déployer un jeu de services complet par ailleurs. Les «grands débutants» pourraient aborder plus facilement les outils disponibles sur ces nouveaux objets connectés à l'Internet.

02 January, 2015 04:18PM par Philippe Latu

23 December 2014

Vincent Bernat

Eudyptula Challenge : démarrage rapide d'un noyau Linux

Le challenge Eudyptula est une série d’exercices de programmation pour le noyau Linux. Il commence avec le très basique module « Hello world » puis progresse en complexité jusqu’à faire pousser des modifications dans l’arbre du noyau Linux.

Une des premières tâches de ce challenge est de compiler puis démarrer son propre noyau. eudyptula-boot est un script autonome permettant de démarrer une image noyau jusqu’à obtenir un shell. Il est livré avec les fonctionnalités suivantes :

  • Il permet de booter quasiment n’importe quel noyau Linux, du noyau fourni par votre distribution favorite jusqu’au noyau personnalisé1 pour travailler sur une fonctionnalité quelconque.

  • Il utilise le système de fichiers de l’hôte comme racine pour le système invité. Aucune image disque n’est donc nécessaire. Ces dernières prennent beaucoup de place, doivent être maintenues à jour, se retrouvent encombrées au fil du temps et les outils dont vous avez besoin ne sont jamais installés. Pour éviter toute modification accidentelle, le système de fichiers est par défaut monté en lecture seule. S’ils sont disponibles, OverlayFS ou aufs sont utilisés pour ajouter une couche accessible en écriture. Il est de plus possible d’utiliser n’importe quel répertoire comme racine.

  • Le répertoire utilisateur est également accessible. Il est ainsi simple de partager des scripts et des programmes avec le système hôte.

  • Il démarre un système minimal avec le strict nécessaire2 pour démarrer un shell dans de bonnes conditions. Le système est opérationnel en moins de cinq secondes.

Dans la vidéo ci-dessous, eudyptula-boot est utilisé pour démarrer le noyau de l’hôte et exécuter quelques commandes :

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="270" src="http://www.youtube-nocookie.com/embed/aiE_Nd_vxQE?rel=0" width="480"></iframe>

Dans la vidéo suivante, nous démarrons un noyau personnalisé contenant un appel système supplémentaire. Il s’agit de la tâche n°15 du challenge Eudyptula. Un programme de test permet de vérifier le bon fonctionnement de l’appel système. Vers la fin, la vidéo contient également une rapide démonstration de gdb.

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="270" src="http://www.youtube-nocookie.com/embed/AEEAmnQ6Q6E?rel=0" width="480"></iframe>

Bien que ce hack permette également de lancer des conteneurs3 avec une isolation accrue, les performances de 9p sont malheureusement peu convaincantes pour un tel usage.


  1. Il est toutefois nécessaire d’activer le support de 9p virtio. Il suffit pour cela d’utiliser make kvmconfig

  2. Seul udev est démarré. 

  3. Un point de départ pour une telle utilisation est de combiner les options --root, --force et --exec. Ajoutez également --readwrite pour conserver les modifications. 

23 December, 2014 12:46PM par Vincent Bernat

17 December 2014

Jean-Baptiste Hétier (djib)

"dmesg -w", vos messages système sous les yeux à tout moment

J'ai découvert au hasard dans la page de manuel de dmesg qu'il existait désormais une option -w (au moins à partir de Debian Jessie) qui permet d'afficher les messages du kernel dès qu'ils sont disponibles. C'est pratique pour suivre les logs système sans avoir à jouer avec tail.

17 December, 2014 07:06PM par djib

10 December 2014

Olivier Berger (perso)

Réparé les hauts-parleurs d'un portable HP dv6000 en échangeant deux nappes internes

Les hauts-parleurs internes du portable HP de mes parents, un dv6000, ne marchaient plus : plus de son sans devoir mettre des enceintes ou un casque :-(

En fait, il semble que ce soit un problème classique, qui semble causé par des nappes de connexion internes deffectueuses.

La réparation n'est pas trop compliquée, si on achète une nappe de remplacement, mais on peut aussi trouver un contournement.

J'ai réussi à échanger les deux nappes qui connectent la carte mère à la partie qui contient les boutons et les hauts-parleurs, au dessus du clavier, et même si maintenant, les boutons de cette rangée supérieure ne marchent plus, ce n'est pas trop grave, car le son est revenu.

Pour voir une vidéo (en anglais) qui explique comment faire, voir : Hp Pavilion Dv6000 power button and speaker fix!

Content d'avoir récupéré le son :-)

10 December, 2014 10:10PM par obergix

29 November 2014

Philippe Latu

Comment effacer les fichiers de configuration inutiles ?

Sur les systèmes Debian GNU/Linux, les outils de gestion de paquets peuvent préserver les fichiers de configuration lors de la suppression d'un paquet. L'idée est que l'administrateur du système puisse retrouver une configuration personnalisée si le paquet supprimé était réinstallé par la suite.

Cependant, ces fichiers de configuration peuvent s'accumuler dans le temps et finir par générer des problèmes lors des migrations d'une version stable à l'autre. Ici, il faut insister sur le facteur temps. Retrouver des fichiers vieux de plus de dix ans n'est pas rare sur certains serveurs comme ceux utilisés pour l'hébergement des boîtes aux lettres de courrier électroniques. Les migrations matérielles d'une machine à l'autre se font depuis longtemps à l'aide de rsync et les systèmes de fichiers suivent. Il est donc utile de «faire le ménage» dans les fichiers de configuration de paquets trop anciens. Voici comment faire.

La version basée sur dpkg est connue de longue date :

# dpkg --purge $(dpkg -l | grep ^rc | cut -d ' ' -f 3 | tr '\n' ' ')

Il existe maintenant une version plus moderne basée sur aptitude :

# aptitude purge ~c

Contrairement à ce que j'avais indiqué dans une première version de ce billet, l'utilisation d'aptitude apporte une simplification considérable. Merci à JCD !.

Si vous avez une proposition de syntaxe encore plus optimisée pour le même traitement, je suis preneur !

29 November, 2014 02:41PM par Philippe Latu

19 October 2014

Jean-Baptiste Hétier (djib)

MoveFromExif : déplacer des images selon leurs infos EXIF

Déplacer des images en fonction des données Exif MoveFromExif est un petit script Ruby que j'ai développé pour déplacer des images selon les données EXIF. Plus précisément il place les photos dans des dossiers arborescents année/mois/jour, mais en l'adaptant légèrement vous pouvez triez vos photos par appareil photo, par objectif, ou par toute autre donnée Exif.

Je diffuse MoveFromExif sous licence libre (GPLv3) afin que vous puissiez justement l'adapter à vos besoins.
Suivez ce lien pour télécharger la dernière version de MoveFromExif.

Évidemment, puisque le script déplace des photos d'un dossier à un autre, je vous recommande très fortement de faire une sauvegarde de vos images et de faire vos premiers essais sur de petits échantillons.

Installation sous Debian GNU/Linux

Sous Debian (et probablement les autres distributions dérivées), lancez les commandes suivantes en tant que root

apt-get install ruby rubygems libimage-exiftool-perl
gem install mini_exiftool

Téléchargez ensuite la dernière version de MoveFromExif et déplacez ensuite automatiquement vos photos avec la commande

./movefromexif.rb /dossier/source /dossier/destination

Installation sous Windows

L'installation sous Windows est un peu plus longue :

  • Téléchargez MoveFromExif ;
  • Téléchargez et installez RubyInstaller ;
  • Téléchargez et dézippez ExifTool dans le répertoire de Exif2CSV (ou un répertoire de votre PATH) ;
  • Renommez exiftool(-k).exe en exiftool.exe ;
  • Lancez cmd.exe et exécutez gem install mini_exiftool. (Vous aurez peut-être besoin de spécifier le chemin complet vers gem.exe, par exemple C:\Ruby186\bin\gem.exe install mini_exiftool)

Vous pourrez ensuite déplacer automatiquement vos photos avec la commande :

./movefromexif.rb C:/dossier/source C:/dossier/destination

De nouveau, en fonction de votre PATH vous aurez peut-êre besoin de spécifier le chemin complet vers ruby.exe, par exemple : C:\Ruby186\bin\ruby.exe movefromexif.rb C:/dossier/source C:/dossier/destination.

Ensuite

N'hésitez pas à vous emparer du script ou à me faire remonter des idées. Personnellement ce script me sert moins depuis que je suis passé sur Shotwell pour la gestion de ma bibliothèque, mais j'en ai encore parfois l'utilité pour de gros tris.

19 October, 2014 09:42PM par djib

12 September 2014

Stéphane Blondon

Key Signing Assistant (concept)

Dans les allées de la DebConf14, j’ai discuté avec Franklin de l’intérêt pour un développeur d’utiliser son téléphone portable lors d’une key signing party.

Les schémas sont un brouillon d’une utilisation possible du téléphone. L’objectif n’est pas de remplacer la rencontre réelle ou la validation mais juste d’aider à l’échange et validation des clefs.

Actuellement, ce n’est qu’un concept ; rien n’est implémenté.

Le principe général est d’utiliser le téléphone comme un terminal pour l’échange et la validation. Les données partent et reviennent sur la station de travail du développeur par l’intermédiaire d’un serveur web.

  • Le téléphone portable considéré doit être un smartphone ;
  • La seule autorisation à donner pour le téléphone est l’accès à internet ;
  • On considère que les échanges réseau sont fait en https. Je ne pense pas que ce soit indispensable mais il n’y a aucune raison de s’en priver.

Avant la key signing party

Le développeur dispose d’un téléphone sur lequel l’application est installée.
Le processus pour installer ses propres informations est le suivant :

Avant la key signing party

Pendant la key signing party

Le processus est à reproduire pour chaque participant.

Pendant la key signing party

Après la key signing party

Une fois rentré chez lui, le développeur récupère l’ensemble de ses validations sur sa machine de travail :

Après la key signing party

Qu’en pensez-vous ?

Source des schémas

Schémas réalisés avec Inkscape, à partir d’icônes Tango et Gnome-Tango.
Les fichiers svg et png sont disponibles dans le répertoire http://stephane.yaal.fr/ksa/.


12 September, 2014 07:18AM par ascendances

20 August 2014

Aurélien Jarno

MIPS Creator CI20

I have received two MIPS Creator CI20 boards, thanks to Imagination Technologies. It’s a small MIPS32 development board:

mips-ci20

As you can see it comes in a nice packaging with a world-compatible power adapter. It uses a Ingenic JZ4780 SoC with a dual core MIPS32 CPU running at 1.2GHz with a PowerVR SGX540 GPU. The board is fitted with 1GB of RAM, 8GB of NOR flash, HDMI output, USB 2.0 ports, Ethernet + Wi-Fi + BlueTooth, SD card slot, IR receiver, expansion headers and more. The schematics are available. The Linux kernel and the U-Boot bootloader sources are also available.

Powering this board with a USB keyboard, a USB mouse and a HDMI display, it boots off the internal flash on a Debian Wheezy up to the XFCE environment. Besides the kernel, the Wi-Fi + Bluetooth firmware, and very few configuration changes, it runs a vanilla Debian. Unfortunately I haven’t found time to play more with it yet, but it looks already quite promising.

The board has not been formally announced yet, so I do not know when it will become available, nor the price, but if you are interested I’ll bring it to DebConf14. Don’t hesitate to ask me if you want to look at it or play with it.

20 August, 2014 08:52PM par aurel32

18 August 2014

Benoit Peccatte

Apache FTP like

Niveau :      
Résumé : alias / /%{username}

Aujourd'hui je voudrais faire un serveur web qui se comporterait comme un serveur FTP ou SFTP. Lorsqu'un utilisateur unix se connecte à un serveur FTP avec un login et un mot de passe, il lui est présenté un contenu qui lui est propre (son $HOME par exemple).

Comment faire l'équivalent avec apache ?

Dit autrement, je voudrais que les 2 commandes suivantes renvoient un contenu différent :

$ wget http://userA@www.monserveur.com/ # répertoire A
$ wget http://userB@www.monserveur.com/ # répertoire B

Pour cela il faut jouer avec les RewriteRules, mais c'est plus balaise que ça en a l'air.

Premièrement il faut une authentification. J'ai choisi ldap, mais prenez la méthode que vous préférez : http://httpd.apache.org/docs/2.2/mo... tout ce qui commence par mod_authn est valable. Voici comment on la met en place :

<Location />
        AuthType basic
        AuthName "My server"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://serveur.ldap.com/dc=domaine,dc=com?uid?sub
        AuthLDAPBindDN cn=user,ou=technical,dc=domaine,dc=com
        AuthLDAPBindPassword password
        Require valid-user
</Location>

Ensuite on joue avec RewriteRule, les variables s'appellent sous la forme %{ENV:VARIABLE}

# utilisez %{ENV:USER_AUTH} pour ceux qui n'ont pas choisi l'authent LDAP
RewriteRule ^(.*) /%{ENV:AUTHENTICATE_uid}/$1

Mais ça ne marche pas. Tout d'abord on apprend qu'il faut mettre les règles dans le Location sinon les variables d'authentification ne sont pas disponibles. Ensuite on a oublié d'activer le rewrite engine. Et enfin dans un location (ou un directory) on ne matche plus la request uri mais le chemin créé à partir de cette uri. Cela qui une fois corrigé nous donne quelque chose comme ça :

<Location />
        RewriteEngine On
        # le résultat sera automatiquement préfixé par le DocumentRoot si on ne le fait pas nous même
        # notez l'absence du / initial dans le pattern ...
        RewriteRule ^var/www/html/(.*) /%{ENV:AUTHENTICATE_uid}/$1 
</Location>

Mais ça ne marche toujours pas. En effet, le rewrite engine d'apache est réentrant, quelle que soit la modification et quel que soit le flag utilisé, si une url est modifiée, apache fait une redirection interne et relance toute la machinerie (dont les redirections). Pour les petits malins, non [L] n'est pas fait pour ça, par contre la doc évoque un [END] qui aurait cette fonctionnalité mais je ne l'ai pas trouvé.

Il nous faut donc un moyen de détecter qu'une url a déjà été transformée par une RewriteRule. Malheureusement les variables (comme %{ENV:AUTHENTICATE_uid}) ne sont valables que dans la partie gauche de RewriteCond ou dans la partie droite de RewriteRule ce qui nous limite sévèrement. On ne peut pas matcher le chemin en pour détecter qu'il contient le répertoire de l'utilisateur. De plus on ne peut pas utiliser une autre racine, apache ajouterait automatiquement le DocumentRoot en cours.

J'ai essayé en utilisant des variables d'environnement temporaire (avec [E=VAR:VALUE]), mais le rewrite engine l'évalue trop tard et ne détecte pas la nouvelle valeur de la variable modifiée par lui-même.

Ma solution est donc de mettre en place un unique répertoire contenant les utilisateurs avec un nom improbable car il ne pourra pas être utilisé comme nom de répertoire dans les répertoires utilisateurs. Et d'utiliser ce nom de répertoire comme marqueur d'url déjà traitée. Ce qui nous donne :

        # mon répertoire s'appelle ____data____
        RewriteRule ^var/www/html/(?!____data____/)(.*) /____data____/%{ENV:AUTHENTICATE_uid}/$1

C'est bien joli, mais ça n'empercherait pas un utilisateur d'aller voir dans le répertorie de son voisin. En effet, ce ne sont que des rewrite rules, pas des droits d'accès. Puisqu'on ne peut pas utiliser les noms de répertoire utilisateur dans les require pour le matcher avec les nom d'utilisateur (on se mordrait la queue (et ça fait mal (au dos))). Il nous faut donc le garantir d'une autre façon, en forçant tout utilisateur a n'accéder qu'à son répertoire avec une autre règle.

        # ce qu'on veut c'est éviter l'utilisateur qui voudrait bypasser la première règle avec un http://www.monserveur.com/____data____/userX
        RewriteRule ^var/www/html/____data____/.*?/(.*) /var/www/html/____data____/%{ENV:AUTHENTICATE_uid}/$1
        # et on voudrait ausst éviter que l'utilisateur puisse scanner la racine
        RewriteRule ^var/www/html/____data____/?$ /var/www/html/____data____/%{ENV:AUTHENTICATE_uid}/

Notez l'ajout de /var/www/html dans les chaines de remplacement, c'est pour éviter qu'apache pense qu'on a modifié le chemin si on n'a rien changé.

Et c'est gagné, on a enfin trouvé !

Je vous laisse donc profiter du résultat :
Edit : la version finale minimise l'appel aux règles, prend en compte les chemins qui se terminent par / et les tentatives d'accès à des répertoires non autorisés.

<Location />
        AuthType basic
        AuthName "My server"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://serveur.ldap.com/dc=domaine,dc=com?uid?sub
        AuthLDAPBindDN cn=user,ou=technical,dc=domaine,dc=com
        AuthLDAPBindPassword password
        Require valid-user

        # make http behave like ftp
        RewriteEngine On
        # create home dir var
        RewriteRule .* - [E=USER_ROOT:/var/www/html/____data____/%{ENV:AUTHENTICATE_homeDirectory}]
        RewriteCond %{ENV:USER_ROOT} !-d
        RewriteRule .* - [E=USER_ROOT:/var/www/html/forbidden]

        # redirection vers les repertpoires utilisateur
        RewriteCond %{REQUEST_FILENAME} !^/var/www/html/____data____
        RewriteRule ^var/www/html/(.*) %{ENV:USER_ROOT}/$1 [L,DPI]

        # impossibilite de lire la racine
        RewriteCond %{REQUEST_FILENAME} ^/var/www/html/____data____/?$
        RewriteRule .* %{ENV:USER_ROOT} [L,DPI]

        # impossibilite de lire le repertoire d'un autre
        RewriteCond %{ENV:AUTHENTICATE_homeDirectory}|%{REQUEST_FILENAME} !^(.*?)\|/var/www/html/____data____/\1
        RewriteRule ^var/www/html/____data____/?[^/]*/?(.*) %{ENV:USER_ROOT}/$1 [L,DPI]
</Location>

<Directory /var/www/html/forbidden>
        deny from all
</Directory>

Note : et pour ceux qui voudraient vraiment faire du FTP avec apache il y a mod_ftp.

Tags:, , ,

18 August, 2014 04:34PM par peck

15 August 2014

Aurélien Jarno

Intel about to disable TSX instructions?

Last time I changed my desktop computer I bought a CPU from the Intel Haswell family, the one available on the market at that time. I carefully selected the CPU to make sure it supports as many instructions extensions as possible in this family (Intel likes segmentation, even high-end CPUs like the Core i7-4770k do not support all possible instructions). I ended-up choosing the Core i7-4771 as it supports the “Transactional Synchronization Extensions” (Intel TSX) instructions, which provide transactional memory support. Support for it has been recently added in the GNU libc, and has been activated in Debian. By choosing this CPU, I wanted to be sure that I can debug this support in case of bug report, like for example in bug#751147.

Recently some computing websites started to mention that the TSX instructions have bugs on Xeon E3 v3 family (and likely on Core i7-4771 as they share the same silicon and stepping), quoting this Intel document. Indeed one can read on page 49:

HSW136. Software Using Intel TSX May Result in Unpredictable System Behavior

Problem: Under a complex set of internal timing conditions and system events, software using the Intel TSX (Transactional Synchronization Extensions) instructions may result in unpredictable system behavior.
Implication: This erratum may result in unpredictable system behavior.
Workaround: It is possible for the BIOS to contain a workaround for this erratum.

And later on page 51:

Due to Erratum HSw136, TSX instructions are disabled and are only supported for software development. See your Intel representative for details.

The same websites tell that Intel is going to disable the TSX instructions via a microcode update. I hope it won’t be the case and that they are going to be able to find a microcode fix. Otherwise it would mean I will have to upgrade my desktop computer earlier than expected. It’s a bit expensive to upgrade it every year and that’s a the reason why I skipped the Ivy Bridge generation which didn’t bring a lot from the instructions point of view. Alternatively I can also skip microcode and BIOS updates, in the hope I won’t need another fix from them at some point.

15 August, 2014 04:02PM par aurel32

13 August 2014

Benoit Peccatte

J’ai pété

... désolé

Niveau :      

Résumé : gdisk /dev/sda

Le format GPT

Guid partition table est un format de partitionnement de disque.

Il ne faut pas confondre un format de partitionnement avec le formatage d'une partition avec système de fichier. Il y a de nombreux formats de système de fichier : ext4, swap, xfs ... Mais il n'existe que peu de format de partitionnement, les plus connus étant :

  • MBR : format utilisé par les premiers PC sous DOS et encore en usage sur la beaucoup de vos machines
  • disklabel : utilisé sur solaris et BSD
  • GPT : apparu récemment (il y a environ 15 ans) pour les besoins de l'itanium

Ce format a pour but de palier les différents problèmes de son prédécesseur direct le MBR :

  • stockage de la table en double et checksum du contenu : la table étant une structure très importante, on peut enfin se dire qu'on ne la perdra plus
  • stockage des offset en LBA sur 64 bits : on arrête de parler de CHS obsolètes depuis longtemps et on espère pouvoir tenir assez longtemps la croissance des tailles de disques : 9 milliards de téra octets avec des secteurs de 512 octets
  • on dépasse donc la limite des 2To supportés par le format MBR, si vous avez un disque de plus de 2Tio il est a peu près certain qu'il a déjà du GPT
  • tous les identifiants sont des UUID : garantis uniques, on peut en créer autant qu'on veut (2^128) et il y en a partout
  • la table fait au minimum 16kio : on n'a plus de question de table primaire/logique/étendue et on peut stocker au moins 128 partitions sans se poser de question
  • accessoirement on peut stocker des noms de partition directement dans la table

Attention, on stocke des adresses de secteur (LBA comme en MBR depuis un certain temps) et non d'octets, et la taille d'un secteur peut varier d'un disque à l'autre, il faut faire attention à ne pas copier les tables GPT trop littéralement.

GPT est indiqué comme nécessaire pour le support du boot sur EFI, bien qu'il soit théoriquement possible de faire sans.

Partitionner en GPT

Pour partitionner en GPT vous avez le choix entre deux familles d'outil :

  • parted et gparted
  • gdisk, sgdisk et cgdisk (remplaçants de la famille fdisk)

Le moins dangereux est de ne partitionner que vos nouveaux disques en GPT, mais il y a moyen de refaire la table de partition d'anciens disques s'il y a suffisament de place pour stocker la table GPT (16kio en début et en fin de disque plus le MBR). Si l'espace est disponible, c'est simple, il vous suffit de reporter les adresses de début et de fin de chaque partition du MBR vers le GPT.

Choix des partitions

Tout d'abord je vous recommande d'aligner vos partition sur 1Mio, le minimum recommandé étant de 4kio. Le minimum de 4ko s'explique par le fait que de plus en plus de disques ont des secteurs de 4ko, et si vos écritures ne sont pas alignées sur 4kio vous allez voir vos performances dégringoler.

Il faut ajouter que de plus en plus de disques sont des SSD. Les SSD ont des pages sur lesquelles il est aussi intéressant de se caler et elles peuvent aller jusqu'à 1Mio.

Donc ne vous posez plus la question et prenez la valeur par défaut de l'outil qui aligne sur le Mio.

  1. Si vous avez un boot sur EFI, vous devez faire une partition EFI (type ESP), ne soyez pas radin, mettez-y au moins 100Mo
  2. Si vous avez un boot sur un BIOS d'origine, il est conseillé de faire une partition de type bios. Certaines personnes indiquent que celle-ci est indispensable car GPT ne laisse pas de place caché pour le bootloader. C'est faux puisqu'il suffit d'aligner les partitions pour faire apparaître de la place. Mais puisqu'on en en est à faire des trucs propres, profitez-en pour faire ce qui aurait du être fait depuis très longtemps et faites de la place pour stocker un bon grub2 avec tous ses modules (1Mo)
  3. Si vous voulez permettre l'hibernation de votre machine (ou si vous avez peu de ram) n'oubliez pas d'inclure une partition de swap.
  4. Pensez à séparer système et données sur deux partitions différentes. La partition de données est naturellement /home pour une particulier, mais sur un serveur c'est plus flou : /var /srv /home sont des répertoire de données.

Compatibilité MBR

Dans la notion de MBR (un unique secteur de 512 octets) il faut différencier le code et la table des partitions.

Si vous utilisez un BIOS classique, le code du MBR restera le même (grub/lilo/boot windows ...).

Si vous utilisez EFI, le code du MBR peut être vide (ce que fait en général gdisk), mais il peut être intéressant de mettre un code fonctionnel avec un avertissement.

La table des partitions du MBR doit elle être protégée pour éviter à un outil d'édition de cette table de tenter d'y faire des modifications et d'effacer vos précieuses données. C'est pour cela qu'on y inscrit un "protective MBR" qui indique que le disque est entièrement utilisé par une partition unique de type GPT.

Tags:, , ,

13 August, 2014 09:29PM par peck

16 June 2014

Christophe Nowicki

Déploiement “en masse” de noyau Linux personnalisé et durci à l’aide de Puppet

200px-Pax_tux

Comme tout barbu qui se respecte, j’aime avoir un noyau Linux, dont la configuration correspond parfaitement au matériel et à l’utilisation d’une machine.

Pour cela j’ai développé un module Puppet qui permet de déployer des noyaux Linux personnalisés et durcis.

Problématique

Compiler et personnaliser la configuration du noyau d’une seule machine est une tâche qui nécessite :

  • une bonne connaissance des options du noyau ;
  • connaissance du matériel et des drivers correspondants ;
  • du temps ;

Il y a de cela une dizaines d’année il était fréquent de compiler une version personnalisée du noyau Linux, mais aujourd’hui le noyau fourni par une distribution GNU/Linux, contient une grande quantité de pilotes et couvre la plupart des besoins.

Il n’y a pas de différence de performance entre un pilote de périphériques compiler en “dur” dans le noyau et charger en modules.

Les seules raisons de compiler un noyau personnalisé sont :

  • la vitesse de démarrage ;
  • et la sécurité.

C’est ce dernier point qui m’a poussé à mettre en place un système de compilation de noyau Linux automatisé.

Module Puppet

Le module Puppet dispose des fonctionnalités suivantes :

  • installation et décompression des sources du noyau dans /usr/src ;
  • application du patch grsecurity ;
  • écriture d’un fichier de configuration personnalisé ;
  • re-compilation du noyau et création d’un paquet pour la distribution Debian GNU/Linux ;
  • compilation en cas de changement de la configuration ;
  • TODO : installation du paquet et reboot sur le nouveau noyau à l’aide de kexec ;

Gestion de la configuration du noyau

D’après le LKDDb (Linux Kernel Driver DataBase), il y a plus de 19 000 options différentes dans un noyau Linux.

L’approche classique pour la gestion d’un tel nombre d’options est l’utilisation d’un tableur Excel ;-)

Mais la plupart des utilisateurs conservent les fichiers de configuration directement sur le système de fichier ou dans un logiciel de gestion de version.

Mais cette approche ne me satisfait pas, j’ai donc opté pour l’utilisation d’une base de données hiérarchique : Hiera

Structure hiérarchique

La structure adoptée est la suivante :

# /etc/puppet/hiera.yaml
---
:backends:
  - yaml
:yaml:
  :datadir: /etc/puppet/hiera/
:logger: puppet
:hierarchy:
  - "fqdn/%{::fqdn}"
  - "boardproductname/%{::boardproductname}"
  - "hardwaremodel/%{::hardwaremodel}"
  - common

common.yaml

Contient la configuration commune à toutes les machines et la “négation” des options, ce qui évite à make-kdpkg de choisir une option par défaut :

# /etc/puppet/hiera/common.yaml
---
linux-grsec::kernel::config:
    CONFIG_CGROUP_DEBUG: n
    CONFIG_CGROUP_FREEZER: n
    CONFIG_CGROUP_DEVICE: n
    CONFIG_CPUSETS: n
    CONFIG_PROC_PID_CPUSET: n
    CONFIG_CGROUP_CPUACCT: n
    CONFIG_RESOURCE_COUNTERS: n
    CONFIG_MEMCG: n
    CONFIG_CGROUP_HUGETLB: n
    CONFIG_CGROUP_PERF: n
    CONFIG_CGROUP_SCHED: n
    CONFIG_FAIR_GROUP_SCHED: n
    CONFIG_CFS_BANDWIDTH: n
    CONFIG_RT_GROUP_SCHED: n
    CONFIG_BLK_CGROUP: n
    CONFIG_CHECKPOINT_RESTORE: n    
    CONFIG_GRKERNSEC: y
    CONFIG_GRKERNSEC_CONFIG_AUTO: n
    CONFIG_GRKERNSEC_CONFIG_CUSTOM: y
    CONFIG_PAX: y
...

Répertoires hardwaremodel et boardproductname

Le répertoire hardwaremodel contiens la définition d’un architecture :

/etc/puppet/hiera/hardwaremodel/
├── i586.yaml
├── i686.yaml
└── x86_64.yaml

Comme par exemple l’architecture x86_64:

# /etc/puppet/hiera/hardwaremodel/x86_64.yaml
---
linux-grsec::kernel::config: 
    CONFIG_64BIT: y
    CONFIG_X86_64: y
    CONFIG_OUTPUT_FORMAT: '"elf64-x86-64"'
    CONFIG_ARCH_DEFCONFIG: '"arch/x86/configs/x86_64_defconfig"'

Le répertoire boardproductname contient la définition des pilote de périphériques pour une machine :

/etc/puppet/hiera/boardproductname/
├── beagleboneblack.yaml
├── C7Q67.yaml
├── D33217GKE.yaml
├── DN2800MT.yaml
├── net5501.yaml
├── net6501.yaml
├── raspberrypi.yaml
├── wandboard.yaml
├── X7SPA-HF.yaml
├── X9SCL.yaml
└── Z68MA-D2H-B3.yaml

Par exemple, pour un net5501 de Soekris Inc. :

# /etc/puppet/hiera/boardproductname/net5501.yaml
---
linux-grsec::kernel::config:
    CONFIG_SMP: n
    CONFIG_X86_64_SMP: n
    CONFIG_X86_32_SMP: n
    CONFIG_RCU_FANOUT: 32
    CONFIG_MGEODE_LX: y
    CONFIG_X86_GENERIC: n
    CONFIG_GENERIC_CPU: n
    CONFIG_NET_VENDOR_VIA: y
    CONFIG_VIA_RHINE: y
    CONFIG_VIA_RHINE_MMIO: y
    CONFIG_HW_RANDOM_GEODE: y
    CONFIG_FB_GEODE: y
    CONFIG_CRYPTO_DEV_GEODE: y
    CONFIG_CRC_T10DIF: y
    CONFIG_ATA_GENERIC: y
    CONFIG_PATA_CS5536: y
    CONFIG_CS5535_MFGPT: y
    CONFIG_SENSORS_PC87360: y
    CONFIG_I2C: y
    CONFIG_SCx200_ACB: y
    CONFIG_LEDS_NET5501: y

Répertoire fqdn

Le répertoire fqdn contient les options spécifique à une machine et à ses fonctionnalités (ici une gateway VPN avec StrongSwan et l’IPS Suricata ) :

# /etc/puppet/hiera/fqdn/foo.bar.yaml
---
linux-grsec::kernel::config:
# StrongSwan
    CONFIG_XFRM_USER: y
    CONFIG_NET_KEY: y
    CONFIG_NET_KEY_MIGRATE: n
    CONFIG_IP_ADVANCED_ROUTER: y
    CONFIG_IP_MULTIPLE_TABLES: y
    CONFIG_INET_AH: y
    CONFIG_INET_ESP: y
    CONFIG_INET_IPCOMP: y
    CONFIG_INET_XFRM_MODE_TRANSPORT: y
    CONFIG_INET_XFRM_MODE_TUNNEL: y
    CONFIG_INET_XFRM_MODE_BEET: y
    CONFIG_NET_IPVTI: n
    CONFIG_IPV6: y
    CONFIG_INET6_AH: y
    CONFIG_INET6_ESP: y
    CONFIG_INET6_IPCOMP: y
    CONFIG_INET6_XFRM_MODE_TRANSPORT: y
    CONFIG_INET6_XFRM_MODE_TUNNEL: y
    CONFIG_INET6_XFRM_MODE_BEET: y
    CONFIG_IPV6_MULTIPLE_TABLES: y
    CONFIG_IPV6_SUBTREES: n
    CONFIG_NETFILTER: y
    CONFIG_NETFILTER_XTABLES: y
    CONFIG_NETFILTER_XT_MATCH_POLICY: y
# Suricata
    CONFIG_NETFILTER_ADVANCED: y
    CONFIG_BRIDGE_NETFILTER: n
    CONFIG_NETFILTER_NETLINK_QUEUE: y
    CONFIG_NETFILTER_NETLINK_ACCT: y
    CONFIG_NETFILTER_XT_TARGET_NFQUEUE: y
...

Configuration finale

$ hiera -h  linux-grsec::kernel::config ::hardwaremodel i586 ::boardproductname net5501 ::fqdn foo.bar
{"CONFIG_NETFILTER_XT_MATCH_STATISTIC"=>"n",
 "CONFIG_BLK_DEV_RSXX"=>"n",
 "CONFIG_USB_CATC"=>"n",
 "CONFIG_MMU"=>"y",
 "CONFIG_GPIO_BCM_KONA"=>"n",
 "CONFIG_CHELSIO_T4VF"=>"n",
 "CONFIG_SERIAL_CORE"=>"y",
 "CONFIG_DM_MIRROR"=>"y",
 "CONFIG_IO_DELAY_TYPE_NONE"=>3,
 "CONFIG_MMC_TEST"=>"n",
...

Exemple d’utilisation

# puppet agent -t
...
info: Applying configuration version '1402952642'
notice: /Stage[main]/Linux-grsec::Kernel/File[/usr/src/foo.config]/ensure: created
info: /Stage[main]/Linux-grsec::Kernel/File[/usr/src/foo.config]: Scheduling refresh of Exec[make-kpkg]
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/linux-3.14.4.tar.xz]/ensure: defined content as '{md5}c7c565d14833550faa39ef8279272182'
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/grsecurity-3.0-3.14.4-201405141623.patch]/ensure: defined content as '{md5}e88a81b0c222d14e228dc29dd76a875a'
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/grsecurity-3.0-3.14.4-201405141623.patch.sig]/ensure: defined content as '{md5}737b22b6e8cae0d4398ba3f68acaf1e1'
notice: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4/grsecurity]/returns: executed successfully
info: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4/grsecurity]: Scheduling refresh of Exec[make-kpkg]
notice: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4]/returns: executed successfully
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/linux-3.14.4/.config]/ensure: created
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: exec make kpkg_version=12.036+nmu3 -f /usr/share/kernel-package/ruleset/minimal.mk debian APPEND_TO_VERSION=-foo  INITRD=YES 
...
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: cp -pf debian/control.dist          debian/control
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: make[2]: Leaving directory `/usr/src/linux-3.14.4'
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: make[1]: Leaving directory `/usr/src/linux-3.14.4'
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]: Triggered 'refresh' from 2 events
notice: Finished catalog run in 179.65 seconds
..
# dpkg -i linux-*.deb

Conclusion

Ce système me permet de déployer des noyaux GRSec sur la petite dizaine de machines de mon réseau local.

Cette méthode ne convient pas au domaine de l’embarqué, (rasberrypi, beaglebone black, wandboard, etc… ) car l’espace disque et la puissance de calcul nécessaire ne sont pas disponible sur ce type de machine.

Références

16 June, 2014 09:33PM par cscm

11 April 2014

Roland Mas

Une page de publicité

Allez, c'est vendredi, c'est permis, je vais m'autoriser deux petites annonces.

Premièrement : rappelez-vous Minami Taiko, ce groupe de tambours japonais du sud de la France. Bon, nous on est des amateurs, mais il se trouve qu'on fait venir, pour le festival Escale à Sète, un vrai groupe de taikos du Japon et tout. Ils s'appellent SEN, et ils vont faire quelques animations musicales dans Sète du 18 au 21 avril. Et avant de repartir dans leur lointain Cipango, ils feront un vrai concert à Montpellier, le mardi 22 avril au soir, sur le campus de l'INRA/Supagro. Et devinez qui fait la première partie ? Minami Taiko, voilà qui ! Donc si vous voulez découvrir le taiko ou voir quelques amateurs suivis d'un vrai groupe, faites donc un tour sur le site de Minami Taiko. À noter qu'il y a aussi un atelier d'initiation le même jour si ça vous intéresse.

Deuxièmement : je suis fier de vous présenter un petit site web que c'est moi qui l'ai fait avec mes petits doigts délicats. Ça s'appelle Chacun sa part, et ça sert à faire des comptes entre amis, genre quand on part en vacances ensemble, ou qu'on fait régulièrement des dépenses partagées dans un groupe de gens. Pour éviter des comptes d'apothicaire à chaque restau, chaque tournée au bar, chaque passage en caisse, on saisit la dépense sur le site, on dit qui a payé et qui a participé, et le site calcule automatiquement les soldes de chacun et propose des suggestions de remboursements pour rééquilibrer les comptes. Y'a un système d'invitations pour que chacun puisse consulter l'état du groupe et saisir des dépenses, des QR-codes pour faciliter la vie aux utilisateurs de smartphone, et même si ça n'a pas encore été testé à grande échelle ça a été validé par une poignée de testeurs dans différentes configurations. Allez-y, c'est cadeau. Chacun sa part. Point com.

11 April, 2014 08:06AM