Hardening consulting

Dans (le futur) FreeRDP 3.0, il y a le support pour le smartcard logon, sur lequel j'ai pas mal travaillé, voyons un petit peu ce qu'il en est.


Support smartcard

On commence par vérifier qu'on voit bien la smartcard, dans mon cas il s'agit d'un yubikey(TM):

$ opensc-tool -l
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Yubico YubiKey OTP+FIDO+CCID 00 00

Lire la suite…

Intéressons nous un peu plus au protocole RDPUDP qui va transporter les données RDP au dessus d'UDP. Pour commencer, on se souviendra que seules les données de canaux virtuels (virtual channels) peuvent être transportées au dessus d'UDP, donc ça ne concerne pas les ordres graphiques anciens (donc si vous comptiez sur UDP pour accélérer des bitmapUpdates c'est perdu), par contre ça fonctionnera avec un rendu egfx. De même la migration de TCP à UDP se fait au travers du canal dynamique, donc le drdynvc est obligatoire. Ce mécanisme permet aussi aux canaux statiques d'être migrés vers UDP en mettant le flag TRANSPORTTYPE_UDP_PREFERRED dans le paquet gcc de multi-transport channel data.

Lire la suite…

J'ai fais quelque modifications dans winPR pour corriger un bug dans les timers avec completion, et je suis tombé sur un soucis qui pourrait intéresser d'autres personnes que moi.

Ça concerne la gestion des EINTR, quand un appel système est interrompu par l'arrivée d'un signal, la réponse va être un -1 et errno positionné à EINTR. Par exemple quand on fait un select ou un read, la manière de se protéger de ce comportement, c'est de faire le code suivant:

#include <sys/select.h>
#include <errno.h>

void myFunction() {
    struct fd_set rset;
    int status, max_fd;

    ...


    do {
        ret = select(max_fd, &rset, NULL, NULL, NULL);
    } while (ret < 0 && errno == EINTR);
}

Bon et bien problème résolu, il suffit d'appliquer ce schéma à chaque fois qu'on a un appel système non ?

Le cas du poll

Lire la suite…

Celà fait quelques temps que je n'avais rien posté. Pour commencer, je vous souhaite une bonne année 2021, plein de belles choses, des projets et puis la santé évidement ! Espérons que la Covid nous laissera un peu tranquille cette année.

Comme je travaille sur le support du transport UDP dans FreeRDP, je fais une petite série de posts sur ce sujet. On va commencer par un aperçu rapide de comment ça marche et ce que ça implique, et je rentrerais sans doute plus dans les détails dans des post suivants.


Aperçu du transport UDP

Documentation et spécifications

Le support UDP dans RDP est détaillé dans plusieurs fichiers de spécifications:

  • MS-RDPBCGR : la spécification de base du RDP, on a quelques flags dans les paquets GCC, et la mise en place du multi-transport;
  • MS-RDPEMT : la spécification du multi-transport, qui permet d'annoncer et de mettre en place plusieurs transports à la fois;
  • MS-RDPEUDP : la spécification du transport UDP lui-même;
  • MS-RDPEUDP2 : la nouvelle mouture du protocole UDP;
  • MS_RDPEDYC : la spécification des channels dynamiques;

Lire la suite…

Un post après une longue période sans rien publier. Récemment j'ai fait beaucoup de choses autour d'ogon, et j'ai dû déployer à la chaine sur plusieurs machines pour des tests. Le guide de déploiement est bien, mais c'est long et répétitif, et puis sutout si c'est consignable dans un manuel d'installation, c'est que c'est automatisable par un script.


Accendino

J'ai donc créé pour ça ce petit logiciel accendino (briquet en italien) qui va nous permettre d'allumer un grand feu (ogon en russe).

Lire la suite…

Que les VMs windows sont lentes sous KVM ! Quand on travaille sur FreeRDP on est inévitablement obligé d'avoir des VMs sous windows pour tester que les vieilles features marchent encore, ou bien pour pouvoir essayer ces nouveautés fantastiques (oui j'aime les licornes).

Lire la suite…

Souvent en utilisant FreeRDP, on se retrouve à devoir augmenter le niveau des traces et à collecter un peu plus de logs que d'ordinaire. Et évidement la plupart du temps, ça ne tient pas dans l'historique du terminal, ou bien on veut que ça se fasse rapidement (l'affichage console peut vraiment ralentir FreeRDP). On peut aussi être sur une machine à distance, et vouloir récupérer tout ça via le réseau.


Comme à chaque fois que je veux utiliser les capacités de WLog (le système de logs de FreeRDP), je dois aller regarder le code source, je me suis dit qu'un petit billet sur le sujet serait l'occasion idéale de se souvenir de tout ça.

Lire la suite…

En travaillant sur topka, j'ai eu l'occasion d'utiliser twisted. Les tutoriaux de twisted sont bien fait, on a pleins d'exemples concrets, malgrés tout après avoir acquis un peu d'expérience avec le framework, j'ai eu envie d'écrire un petit article sur le sujet.

Note: cet article ne contient rien qui ne soit déjà dans la documentation de twisted

Utilisation des deferred

Quand on utilise twisted, il peut arriver qu'on se retrouve avec un résultat qui puisse être une valeur ou bien un Deferred. C'est le cas s'il est possible que le résultat soit disponible directement, ou bien qu'on doivent attendre. On peut avoir ce genre de code:

import twisted.internet.defer as defer

def myFunc():
    def treatRet():
        ...

    ret = functionThatProcess(...)
    if isinstance(ret, defer.Deferred):
        ret.addCallback(treatRet)
    else:
        ret = treatRet(ret)

    return ret

Lire la suite…

Mieux vaut tard que jamais ! Il y a quatre ans, je faisais un talk sur FreeRDS à la XDC 2014 où j'annonçais que nous en ferions l'open sourcing sans doute fin 2014, et déjà c'était quelque chose d'initialement prévu pour Septembre 2014. Finalement l'openSourcing tant attendu est là, mais en Avril 2018: juste un tout petit peu de retard !


Présentation

Du retard

Alors évidement il s'en est passé des choses depuis fin 2014. Pour commencer, le nom du projet a changé: le nom FreeRDS appartenait à un des membres du projet, et ce sur quoi nous avons travaillé a radicalement divergé de la collaboration commune des débuts, d'où la nécessité de changer de nom. Nous avions pensé à fireRDS,

Lire la suite…

Suite à cette petite vidéo sur meson, j'ai eu envie de jouer un peu avec ce logiciel pour voir ce qu'il valait en pratique. J'ai donc fait un premier essai sur un sous-projet d'OGON qui utilise cmake comme système de build.


CMake mon amour

J'entends dire partout: tout le monde déteste cmake, mais pour plein de mauvaises raisons, plein de projets l'utilisent. Je ne fais pas exception à la masse: à chaque fois que je dois toucher à du cmake, cela commence par une appréhension, et le langage est tellement moche que même quand j'arrive à faire ce que je veux, je n'ai jamais l'impression d'avoir fait du beau boulot. Et puis souvent, ça ne se passe pas comme je veux, et là les phases de débuggage sont toujours épiques. Je ne dois vraiment pas avoir la philosophie cmake, parce qu'à chaque fois j'ai l'impression que le logiciel fait le contraire de ce à quoi je m'attendrais. Bref, dés qu'il y a du cmake à faire j'y vais à reculons.

Lire la suite…