Безопасное удаление файлов

Discussion in 'Безопасность и Анонимность' started by ShadOS, 13 Feb 2007.

  1. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    Вот от нечего делать наколбасил скрипт на bash о назначение которого можно узнать из комментариев. Собственно скрипт имеет "ограниченную" пригодность ввиду скорости выполнения (Опять же читаем комантарии), однако представяет собой интерес в виде примера использования. Представляю на суд общественности, приветствуются советы по улучшению скорости, качества и т.п Короче, обсуждаем.

    Code:
    #!/bin/bash
    
    hell=(
    ' shred.sh: wiper by ShadOS [Hell Knights Crew]\n'
    '//-------------------------------------------\n'
    ' The Mainest Evil of Runet                   \n'
    '  _  _     _ _ _  __     _      _   _        \n'
    ' | || |___| | | |/ /_ _ (_)__ _| |_| |_ ___  \n'
    ' | __ / -_) | | . <| . \| / _. | . \  _(_-<  \n'
    ' |_||_\___|_|_|_|\_\_||_|_\__. |_||_\__/__/  \n'
    '     hellknights.void.ru  |___/  .0x48k.     \n'
    '     shados.0x48k.cc             .ShadOS.    \n'
    '//-------------------------------------------\n'
    )
    
    #  Этот сценарий записывает случайные данные в заданный файл,
    #+ затем записывает туда нули и наконец удаляет файл.
    #  После такого удаления даже анализ дисковых секторов
    #+ не даст ровным счетом ничего.
    
    #  Это довольно надежный, хотя и достаточно медленный способ уничтожения файлов.
    #+ Более эффективно это делает команда "shred",
    #+ входящая в состав пакета GNU "fileutils".
    
    #Далее привожу выдержку из man shred из состава GNU "fileutils"
    #ВНИМАНИЕ: Помните, что shred полагается на очень важное предположение:
    #что ваша файловая система перезаписывает файлы "на месте".
    #Традиционно это так и делается, но многие современные файловые системы
    #не удовлетворяют этому предположению. Вот примеры файловых систем, на
    #которых shred не эффективен или не дает гарантии эффективности во всех
    #режимах файловой системы:
    
    #* log-structured or journaled file systems, such as those supplied with
    #AIX and Solaris (and JFS, ReiserFS, XFS, Ext3, etc.)
    
    #* file systems that write redundant data and carry on even if some writes
    #fail, such as RAID-based file systems
    
    #* file systems that make snapshots, such as Network Appliance's NFS server
    
    #* file systems that cache in temporary locations, such as NFS
    #version 3 clients
    
    #* compressed file systems
    
    #In the case of ext3 file systems, the above disclaimer applies
    #(and shred is thus of limited effectiveness) only in data=journal mode,
    #which journals file data in addition to just metadata. In both the
    #data=ordered (default) and data=writeback modes, shred works as usual.
    #Ext3 journaling modes can be changed by adding the data=something option
    #to the mount options for a particular file system in the /etc/fstab file,
    #as documented in the mount man page (man mount).
    #Конец выдержки
    
    #  Уничтоженный таким образом файл, не сможет быть восстановлен обычными методами.
    #  Однако...
    #+ эта метода вероятно НЕ сможет противостоять аналитическим службам
    #+ из СООТВЕТСТВУЮЩИХ ОРГАНОВ
    
    #  Tom Vier разработал пакет "wipe", который более надежно стирает файлы
    #+ чем этот простой сценарий.
    #     http://www.ibiblio.org/pub/Linux/utils/file/wipe-2.0.0.tar.bz2
    
    #  Для более глубоко изучения проблемы надежного удаления файлов,
    #+ рекомендую обратиться к статье Питера Гутмана (Peter Gutmann),
    #+     "Secure Deletion of Data From Magnetic and Solid-State Memory".
    #         http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html
    
    # Также рекомендуем обратиться к моей статье за дополнительной информацией.
    #     http://hellknights.void.ru/articles/0x48k-Cleaners.htm
      
    BLOCKSIZE=1      #  операции ввода/вывода в/из /dev/urandom требуют указания размера блока,
                     #+ иначе вы не получите желаемого результата.
    E_BADARGS=70
    E_NOT_FOUND=71
    E_CHANGED_MIND=72
    
    val=( "\x55" "\xAA" "\x92" "\x49" "\x24" "\x00" "\x11" "\x22" "\x33"
          "\x44" "\x55" "\x66" "\x77" "\x88" "\x99" "\xAA" "\xBB" "\xCC"
          "\xDD" "\xEE" "\xFF" "\x55" "\xAA" "\x92" "\x00" "\x49" "\x24")
    
    RANDOM=$$       # Инициализация генератора случайных чисел числом PID процесса-сценария.
    
    PIPS=256        # Значения от 0 до 256
    
    #echo "${#val}"         #Длинна массива
    #echo "${#val[*]}"      #Количество элементов массива 
    #echo -e "${val[@]}"    #Вывод массива
    
    hexcvt ()
    {
      BASE=16
      if [ -z "$1" ]
      then
        echo 0
        return    # "Return" 0, если функции не был передан аргумент.
      fi
      echo ""$1" "$BASE" o p" | dc
      # "o" устанавливает основание системы счисления для вывода.
      # "p" выводит число, находящееся на вершине стека.
      # См. 'man dc'.
      return
    }
    
    
    random_fill()
    {
      if [ $gen="rnd" ]    # rnd, иначе /dev/urandom по-умолчанию
      then
        for ((j=$flength; j > 0 ; j--))
        do 
          let "die1 = RANDOM % $PIPS"
          die1=`hexcvt $die1`
          die1=`echo "\x""$die1"`
          echo -ne $die1 >> $file
        done  
      else
         dd if=/dev/urandom of=$file bs=$BLOCKSIZE count=$flength
      fi 
    }
    
    usage ()
    {
      echo -e "Порядок использования: `basename $0` <filename> <visr|bs|pg> <rnd|dev>"
      echo -e "\tАлгоритмы:"
      echo -e "\t   visr - VISR"
      echo -e "\t   bs - Брюса Шнайера"
      echo -e "\t   pg - Питера Гутмана"
      echo -e "\tГенераторы псевдослучайных последовательностей:"
      echo -e "\t   rnd - \$RANDOM (быстро, предсказуемей, по-умолчанию)"
      echo -e "\t   dev - /dev/urandom (медленней, надёжней)"
      exit $E_BADARGS
    }
    
    clear
    
    echo -en '\E[34;40m'"\033[1m${hell[@]}\033[0m" 
    
    if [ -z "$3" ]     # Имя файла, генератор и алгоритм не указан.
    then
     usage
    fi
    
    file=$1
    alg=$2
    gen=$3
    
    if [ ! -e "$file" ]
    then
      echo "Файл \"$file\" не найден."
      exit $E_NOT_FOUND
    fi
    
    echo; echo -ne "Вы уверены в том, что желаете \033[1mуничтожить\033[0m \"$file\" по алгоритму \"$2\" (y/n)? "
    read answer
    case "$answer" in
    [nN]) echo "Передумали? Операция отменена."
          exit $E_CHANGED_MIND
          ;;
    *)    echo -e "\033[1mУничтожается\033[0m файл \"$file\".";;
    esac
    
    stime=$(date +%H%M%S%N)
    echo "Запущен в $(date +%H:%M:%S.%N)"
    flength=$(ls -l "$file" | awk '{print $5}')  # Поле с номером 5 - это длина файла.
    cat /dev/null > $file                        # Переходим в начало файла
    
    echo
    
    case "$alg" in
    visr | VISR) #Затираем по алгоритму VISR
      pass_count=0
      for i in 1 2 3
      do
        let "pass_count += 1"
        echo "Проход $pass_count"
        dd if=/dev/zero of=$file bs=$BLOCKSIZE count=$flength
        sync
        cat /dev/null > $file         # Переходим в начало файла
        let "pass_count += 1"
        echo "Проход $pass_count"
        for ((j=$flength; j > 0; j--))
        do
          echo -ne "\xFF" >> $file
        done
        sync
        cat /dev/null > $file          # Переходим в начало файла
      done
      let "pass_count += 1"
      echo "Проход $pass_count"
      for ((j=$flength; j > 0; j--))
      do
        echo -ne "\xAA" >> $file
      done
      sync
      ;;
    bs | BS) #Затираем по алгоритму Брюса Шнайера
      pass_count=1
      echo "Проход $pass_count"
      for ((i=$flength; i > 0; i--))
      do
        echo -ne "\xFF" >> $file
      done
      sync
      cat /dev/null > $file           # Переходим в начало файла
      let "pass_count += 1"
      echo "Проход $pass_count"
      dd if=/dev/zero of=$file bs=$BLOCKSIZE count=$flength    
      sync
      cat /dev/null > $file           # Переходим в начало файла
      for i in 3 4 5 6 7
      do
        let "pass_count += 1"
        echo "Проход $pass_count"
        random_fill
        sync  
        cat /dev/null > $file         # Переходим в начало файла
      done;;
    pg | PG) #Затираем по алгоритму Питера Гутмана
      pass_count=0
      for i in 1 2 3 4
      do
        let "pass_count += 1"
        echo "Проход $pass_count"
        random_fill
        sync
        cat /dev/null > $file         # Переходим в начало файла
      done
      for ((i=0; i < ${#val[*]} ; i++))
      do
        let "pass_count += 1"
        echo "Проход $pass_count"
        for ((j=$flength; j > 0 ; j--))
        do
          echo -ne "${val[i]}" >> $file
        done  
        sync
        cat /dev/null > $file           # Переходим в начало файла
      done
      for i in 32 33 34 35
      do
        let "pass_count += 1"
        echo "Проход $pass_count"
        random_fill
        sync
        cat /dev/null > $file           # Переходим в начало файла
      done;;
    *) #Для некорректного ввода  
      echo "Алгоритм был задан некорректно!"
      usage
    esac
    
    rm -f $file    # Наконец удалить изрядно "подпорченный" файл.
    sync           # Вытолкнуть буферы в последний раз.
    
    let "stime=$(date +%H%M%S%N)-stime"
    echo $stime
    echo "Остановлен в $(date +%H:%M:%S.%N)"
    
    echo -e "Файл \"$file\" \033[1mуничтожен\033[0m."; echo
    echo -e "\a"
    
    exit 0
    
     
    #1 ShadOS, 13 Feb 2007
    Last edited: 13 Feb 2007
    6 people like this.
  2. hsi

    hsi Member

    Joined:
    11 Sep 2006
    Messages:
    214
    Likes Received:
    61
    Reputations:
    7
    Неплохой сценарий, только мне кажется, что гораздо удобнее было бы переписать его на Си и поставлять в двух вариантах - исходниках и бинарном файле.
    Чтобы без лишних телодвижений можно было писать в консоль ./shred [параметры]
    Тогда будет и быстрее и удобнее.
     
    1 person likes this.
  3. ATFakep

    ATFakep Elder - Старейшина

    Joined:
    11 Dec 2006
    Messages:
    83
    Likes Received:
    77
    Reputations:
    51
    ./shreder.sh [параметры], тот же самый эффект +)
     
    3 people like this.
  4. hsi

    hsi Member

    Joined:
    11 Sep 2006
    Messages:
    214
    Likes Received:
    61
    Reputations:
    7
    Arvi The Fakep
    bash работает медленнее. :)
     
    1 person likes this.
  5. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    Хм... так нечно подобное в виде бинарников уже есть. Вы комменты к скрипту внимательно почитайте. Вот примеры с исходниками:
    http://www.ibiblio.org/pub/Linux/utils/file/wipe-2.2.0.tar.bz2
    Помимо этого есть ещё проприетарный BCWipe для всех осеновных *nix систем и для Win. Я им долгое время пользовался. Найти можно на www.jetico.com.
    Ещё можно GNU Shred из состава fileutils попробовать. Мой сценарий - это всего лишь эксперимент и хороший пример сценария на bash, но, скорее всего, не для реального использования в боевых условиях.
     
    #5 ShadOS, 19 Feb 2007
    Last edited: 19 Feb 2007
  6. hsi

    hsi Member

    Joined:
    11 Sep 2006
    Messages:
    214
    Likes Received:
    61
    Reputations:
    7
    ShadOS
    Я имел в виду версию в виде одиного маленького бинарника, именно для боевых условий. Тогда его можно просто везде с собой таскать. :)
     
  7. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    хм... это уже сложнее. А как же проблемы переносимости? Хотя можно попробовать что-нибудь написать =) Спасибо за идею.
     
  8. hsi

    hsi Member

    Joined:
    11 Sep 2006
    Messages:
    214
    Likes Received:
    61
    Reputations:
    7
    ShadOS
    Алгоритм несложный и проблем совместимости возникнуть не должно.
     
Loading...
Similar Threads - Безопасное удаление файлов
  1. xakepok777
    Replies:
    4
    Views:
    4,227