Можно ли подделать конкретный путь для процесса?

Как со всеми вещами, имеющими отношение к безопасности, нет никаких гарантий, но также необходимо сбалансировать риск (и стоить) против вероятности. На основе опыта (и я выполнял десятки *, отклоняют boxen со средневековья), у меня действительно никогда не было значительного вызванного питанием повреждения файловой системы.

Некоторые из этих машин даже работали на non-journalled файловых системах (ufs и ext2 обычно). Некоторые из них были встроены, и некоторые были мобильными телефонами как Nokia N900 — таким образом, хороший источник питания не был вообще гарантирован.

It не, что повреждения файловой системы не может произойти, это просто, что вероятность его, случай является достаточно низким, что это не должно волновать Вас. Однако, никакая причина не застраховать Ваши ставки.

В ответе на Ваши литеральные вопросы:

  1. По крайней мере, первая книга, на которую Вы сослались, была записана прежде ext4 — когда автор предлагает использовать ext3, они действительно говорят, ‘не используют нестабильные или non-journalled файловые системы как ext2’). Попробовать ext4, это является довольно сформировавшимся, и имеет некоторые достойные опции для невращающих дисков, которые могут расширить продолжительность жизни Вашего устройства флэш-памяти.
  2. Возможности - это, потерял бы Вас последний блок или два, не весь файл. С журналируемой файловой системой это будет о единственной потере. Существуют сценарии отказа, где я видел случайные данные, распыляемые через файл, но они кажется, намереваются настолько же, вероятно, как разрушение микрометеорита прямо через Ваше встроенное устройство.
  3. См. 2. Ничто не сейф на 100,00%.
  4. Если Вы имеете второй канал IDE, засовываете вторую карту CF там и захватываете резервное копирование файловой системы периодически. Существует несколько способов сделать это: rsync, cp dump, dd, даже использование md(4) (программное обеспечение RAID) устройство (Вы иногда добавляете второй диск, позвольте ему синхронизировать, затем удалить его — если оба устройства живы все время, они выполняют тот же риск повреждения файловой системы). При использовании LVM можно даже захватить снимки. Поскольку сбор данных встроил устройство, я буду просто использовать, специальное решение, которое монтирует вторую файловую систему, копии по журналу данных, сразу размонтирования это. Если Вы волнуетесь по поводу устройства, имеющего хороший загрузочный образ, прикрепляете вторую копию диспетчера начальной загрузки и всех необходимых загрузочных образов на втором устройстве и настраиваете компьютер для начальной загрузки от любого карты CF.

    Я не доверял бы второй копии на том же устройстве, потому что устройства хранения перестали работать чаще, чем стабильные файловые системы. Намного чаще, по моему опыту, до сих пор (на работе, была горькая полушутка о странно высоких возможностях отказов диска дня пятницы. Это было почти еженедельное событие некоторое время). Вращается ли диск или нет, он может перестать работать. Поэтому сохраните свои яйца в двух корзинах, если Вы можете, и Вы защитите свои данные лучше.

    Если бы данные особенно уязвимы, я нанес бы регулярные визиты в устройство, подкачал бы резервный CF для нового и перезагрузки, позволив им fsck все его файловые системы в придачу.

9
21.10.2015, 15:08
2 ответа

Вот очень простой пример использования util-linux's unshare, чтобы поместить процесс в частное пространство имен монтирования и дать ему другое представление о той же файловой системе, которую сейчас имеет его родитель:

{   cd /tmp                      #usually a safe place for this stuff
    echo hey   >file             #some
    echo there >file2            #evidence
    sudo unshare -m sh -c '      #unshare requires root by default
         mount -B file2 file     #bind mount there over hey
         cat file                #show it
         kill -TSTP "$$"         #suspend root shell and switch back to parent
         umount file             #unbind there
         cat file'               #show it
    cat file                     #root shell just suspended
    fg                           #bring it back
    cat file2                    #round it off
}

there                            #root shell
hey                              #root shell suspended
hey                              #root shell restored
there                            #rounded

Вы можете предоставить процессу частное представление его файловой системы с помощью утилиты unshare в современных системах linux, хотя сам механизм пространства имен монтирования был достаточно зрелым для всей серии ядер 3. x серии ядра. Вы можете войти в уже существующие пространства имен всех видов с помощью утилиты nsenter из того же пакета, а узнать больше можно с помощью man.

5
27.01.2020, 20:05

LD_PRELOAD не так уж и сложен, и вам не нужно быть пользователем root. Вставьте свою собственную процедуру C, которая вызывается вместо реальный open () в библиотеке C. Ваша процедура проверяет, является ли открываемый файл «/tmp/adb.log», и вызывает настоящее открытие с другим именем файла. Вот ваш shim_open.c:

/*
 * capture calls to a routine and replace with your code
 * gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
 * LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
 */
#define _FCNTL_H 1 /* hack for open() prototype */
#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#define OLDNAME "/tmp/adb.log"
#define NEWNAME "/tmp/myadb.log"

int open(const char *pathname, int flags, mode_t mode){
    static int (*real_open)(const char *pathname, int flags, mode_t mode) = NULL;

    if (!real_open) {
        real_open = dlsym(RTLD_NEXT, "open");
        char *error = dlerror();
        if (error != NULL) {
            fprintf(stderr, "%s\n", error);
            exit(1);
        }
    }
    if (strcmp(pathname,OLDNAME)==0) pathname = NEWNAME;
    fprintf(stderr, "opening: %s\n", pathname);
    return real_open(pathname, flags, mode);
}

Скомпилируйте его с помощью gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c и проверьте его, поместив что-нибудь в / tmp / myadb.log и работает LD_PRELOAD = / ... / shim_open.so cat /tmp/adb.log. Тогда попробуйте LD_PRELOAD на adb.

11
27.01.2020, 20:05

Теги

Похожие вопросы