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édente | |||
| lib:rlbox [2021/07/13 23:39] – Ajout du diaporama 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 18: | Ligne 20: | ||
| * 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 renvoyée. | * 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 renvoyée. | ||
| * Une vérification manuelle peut être ajoutée. 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::string | ||
| + | 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.1626212349.txt.gz · Dernière modification : de root
