lib:rlbox
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
lib:rlbox [2020/08/08 20:31] – Clarification de l'utilisation de la sandbox root | lib:rlbox [2021/07/14 17:05] (Version actuelle) – Ajout de "Fonction renvoyant un char* alloué" root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
Librairie SandBox développé par Firefox. | Librairie SandBox développé par Firefox. | ||
+ | |||
+ | ====Théorie==== | ||
[[https:// | [[https:// | ||
Ligne 6: | Ligne 8: | ||
[[https:// | [[https:// | ||
+ | |||
+ | [[https:// | ||
De ce que j'ai compris, cela force la réalisation d'une copie dans le tas de la donnée à transmettre à la librairie. | De ce que j'ai compris, cela force la réalisation d'une copie dans le tas de la donnée à transmettre à la librairie. | ||
Ligne 14: | Ligne 18: | ||
* en cas de buffer overflow, on ne risque pas d' | * en cas de buffer overflow, on ne risque pas d' | ||
* Lorsque la fonction renvoie sa valeur, il y a : | * Lorsque la fonction renvoie sa valeur, il y a : | ||
- | * une vérification automatique de type UBSan pour vérifier que la variable qui va héberger la valeur est assez grande pour la valeur | + | * une vérification automatique de type UBSan pour vérifier que la variable qui va héberger la valeur est assez grande pour la valeur |
- | * Une vérification manuelle peut être ajouter. La fonction doit alors être écrite par le développeur. | + | * Une vérification manuelle peut être ajoutée. La fonction doit alors être écrite par le développeur. |
+ | |||
+ | ====Exemples==== | ||
+ | |||
+ | ===Fonction renvoyant un char* alloué=== | ||
+ | |||
+ | La libération de la mémoire du texte renvoyé est à notre charge. | ||
+ | |||
+ | <code cpp> | ||
+ | #define RLBOX_SINGLE_THREADED_INVOCATIONS | ||
+ | #define RLBOX_USE_STATIC_CALLS() rlbox_noop_sandbox_lookup_symbol | ||
+ | |||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #include < | ||
+ | |||
+ | // Classe libérant la mémoire quand la donnée n'est plus utilisée. | ||
+ | template < | ||
+ | class AutoFree | ||
+ | { | ||
+ | | ||
+ | AutoFree(rlbox:: | ||
+ | { | ||
+ | } | ||
+ | ~AutoFree() { free(_taint.UNSAFE_unverified()); | ||
+ | rlbox:: | ||
+ | |||
+ | | ||
+ | rlbox:: | ||
+ | }; | ||
+ | |||
+ | // Fonction risquée | ||
+ | char* unsecure_function(char* data, int nb) | ||
+ | { | ||
+ | char* retval = static_cast< | ||
+ | strcpy(retval, | ||
+ | return retval; | ||
+ | } | ||
+ | |||
+ | // Fonction sécurisée | ||
+ | std:: | ||
+ | secure_function(rlbox:: | ||
+ | const std:: | ||
+ | { | ||
+ | size_t helloSize = unsafe_data.length() + 1; | ||
+ | |||
+ | auto taintedStr = sandbox.malloc_in_sandbox< | ||
+ | |||
+ | // La librairie n' | ||
+ | std:: | ||
+ | taintedStr.unverified_safe_pointer_because(helloSize, | ||
+ | unsafe_data.c_str(), | ||
+ | |||
+ | // On récupère la valeur de retour de façon sécurisée. | ||
+ | AutoFree< | ||
+ | sandbox.invoke_sandbox_function(unsecure_function, | ||
+ | |||
+ | // On récupère la valeur de retour après vérification. | ||
+ | auto retval = retvalTainted.get().copy_and_verify_string( | ||
+ | [](std:: | ||
+ | { | ||
+ | size_t len = strlen(ret.get()); | ||
+ | if (simdjson:: | ||
+ | return std:: | ||
+ | else | ||
+ | return std:: | ||
+ | }); | ||
+ | |||
+ | sandbox.free_in_sandbox(taintedStr); | ||
+ | |||
+ | return retval.value_or(" | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | rlbox:: | ||
+ | sandbox.create_sandbox(); | ||
+ | |||
+ | std::cout << secure_function(sandbox, | ||
+ | std::cout << secure_function(sandbox, | ||
+ | |||
+ | sandbox.destroy_sandbox(); | ||
+ | } | ||
+ | </ |
lib/rlbox.1596911506.txt.gz · Dernière modification : 2020/08/08 20:31 de root