Могу ли я повредить свою ОС из-за неправильного использования назначений указателей и изменения значений? - PullRequest
1 голос
/ 27 апреля 2020

Как видно из названия, я новичок в C ++ и практикую множество различных программ в Code :: Blocks IDE. Я думал об этом сегодня и не могу получить точный ответ. Могу ли я непреднамеренно повредить данные в моей ОС при неправильном использовании указателей? Немного подробнее:

char *p ; //creating uninitialized pointer with a random address; 
          //let's assume it's the address to a variable within a valid file?
*p = 'G' ;

//or

int *p ; 
*p = 2 ;

Может ли это сделать в моих файлах IDE / компилятора потенциально повреждать определенные данные, такие как:

  1. Файлы операционных систем - возможно файлы основной операционной системы и изменение значения от 1 ---> 2 может привести к физическому повреждению внешнего устройства.

    И / ИЛИ

  2. Неоткрытые случайные файлы включены C: диск - скажем, например, важный файл с 256-битным шифрованием; изменение единственного значения сделает дешифрование документа практически невозможным и, таким образом, приведет к полностью поврежденному и невосстановимому важному документу. Я не буду знать об этом повреждении до тех пор, пока не пройдут месяцы, пока я пытаюсь открыть файл, но получаю сообщение об ошибке во время расшифровки.

    И / ИЛИ

  3. Открытые программы, использующие временную память. Скажем, например, что в настоящее время я запускаю программу-кошелек Bitcoin из холодного хранилища (дрянную), и в качестве гипотетической программы программа открыла динамически размещенный файл, который зашифрован. Этот файл содержит файл подтверждения ключа резервной копии, необходимый для получения доступа к $ 100 тыс. В биткойнах холодного хранения; изменение символа в файле навсегда повредит файл и приведет к потере данных резервной копии ключа восстановления. Поэтому, если я когда-нибудь забуду свой пароль к кошельку bitcoin, попытка использовать функцию восстановления потерпит неудачу и приведет к необратимой потере первоначального взноса в хорошем доме.

Так что это некоторые примеры, и мне интересно, если любой из них возможен, просто возиться с указателями, пытаясь изучить C ++. Я не хочу случайно вызывать какой-либо из указанных выше сценариев ios сейчас или в будущем (возможно, работая над большим проектом, в котором вышеуказанный сценарий ios будет означать катастрофу), поэтому, пожалуйста, дайте мне знать, если какой-либо из этих сценариев ios возможны (хотя очень низкая вероятность того, что произойдет, но все же возможно, возможно). Также, будьте добры, объясните динамику предотвращения вышеупомянутого сценария ios, если возможно испортить данные в ОС, используя недействительные указатели, увеличивая утечки памяти и т. Д.

Ответы [ 2 ]

5 голосов
/ 27 апреля 2020

Правильно спроектированная современная ОС должна быть разработана таким образом, чтобы вы не могли повредить ОС, запустив написанную вами программу. Обратите внимание на следует ; посмотрите на список CVE , где приведено множество примеров, где этого не произошло.

Модель угроз для большинства операционных систем, на которых вы можете разрабатывать, не защищает ваши личные файлы от запускаемой вами программы. См. XKCD 1200 . Однако вы можете принять меры предосторожности, такие как:

  • Запуск программы с отдельным идентификатором пользователя
  • , запуск программы на виртуальной машине
  • или запуск программы. программа в среде chroot
  • или запуск программы во время действия Обязательного контроля доступа, который не позволяет программе записывать файлы за пределы указанного каталога или открывать сетевые сокеты (например, SE Linux)
  • и путем правильного понимания программы и избежания таких ошибок, как эта

Риск также уменьшается благодаря следующим соображениям:

  • Неинициализированный указатель скорее всего, будет ноль, следовательно, ноль, и, следовательно, вызовет ошибку сегментации, когда вы его используете; или если задано «случайное» значение, которое может указывать на не отображенную память, с тем же результатом
  • Даже если вы изменили аргумент для последующего std::fstream::open (или open из POSIX, или fopen из C stdio API или какой-либо другой подобной ОС-функции c), маловероятно, что вы на самом деле измените ее на что-то, что на самом деле соответствует имени файла, используемого другой программой. Гораздо более вероятно либо ввести байт мусора в имя файла, либо сразу же его обрезать; если ваша программа уже не выполняет что-то вроде «перечисления всех файлов в моем домашнем каталоге и открытия каждого из них».

Кстати, код, который вы даете для установки «случайного» бита памяти для чего-либо » Случайный », вероятно, будет далеко не« случайным »во многих случаях. Например, это может быть одно и то же значение при каждом запуске программы. Некоторые лучшие (хотя C, а не C ++) альтернативы ...

   // #1
   char *p = rand();
   *p = rand();

   // #2
   FILE * randomDevice = fopen("/dev/urandom", "r");
   char *p;
   fread(&p, sizeof(char *), 1, randomDevice);
   fread( p, sizeof(char),   1, randomDevice);
3 голосов
/ 27 апреля 2020

Могу ли я повредить свою ОС из-за неправильного использования назначений указателей и изменения значений?

Скорее всего, нет.

В современных настольных ОС и серверных ОС память пространство, используемое процессами, является виртуальным. Доступ к неверной памяти вызывает неопределенное поведение, но это не позволяет процессу изменять файлы / память, к которым у него нет доступа.

Вы можете повредить ОС, если:

  1. Вы запустили программа с привилегиями root / admininstrative и
  2. Вы изменяете / удаляете файлы, необходимые для правильной работы ОС.

Я не могу прокомментировать, что может произойти на платформах которые не используют виртуальную память для процессов из-за отсутствия опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...