1

Приветствую!

Возник вопрос по безопасности и программировании.

Системе на вход приходят данные по эл.почте.
Чтение информации из файла - вложения осуществляется наподобие такого.

#include <fstream>

void rf(char *nFile)
{
  char s[128];

  ifstream rf(nFile);

  if (rf != NULL)
  {
     rf.getline(s, sizeof(s));

     short k=0; 
     while ( k<128 && s[k]!='\n' && s[k]!='\0' ) k++;

     if (s[0]=='X' && k<128)  cout<<s<<"\n";
     else                              cout<<"Error\n";
  }

  rf.close();
}

Если отправитель будет скомпрометирован и
пришлет вместо данных файл с вирусом,
а программа попробует его считать - чем это чревато?

Могут ли быть выполнены микрокоманды при вызове getline ?
Т.е. не приведет ли это (например) к зависанию исполняемой программы?

Возможно, системе вреда и не будет (пользователь не привилегирован).
Вопрос в защите данных пользователя.

2

Я не специалист по C, но, насколько я понял, Вы просто считываете файл и выводите его на экран. По сути, делаете то же самое, что команда cat. А что в таком случае будет? Ничего, просто отобразятся символы и всё.
Лучше подумайте над обработкой служебных символов, коды которых меньше 32. Там и новая строка, и табуляция, и много чего ещё есть ab .

P.S. Используйте соответствующие BB-коды.

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD, DDR4 32 GB, SSD 500GB + HDD 2TB | Linux Mint 21.3 Cinnamon + Fedora 39 MATE (Compiz) + Windows 11 + macOS 12 Monterey

3 (25.03.2019 22:05:19 отредактировано bormant)

Rizado пишет:

Ничего, просто отобразятся символы и всё.

А также будут обработаны ESC-последовательности. Не все из них совершенно безобидны.

4

Правильно ли я понимаю, что при вызове getline данные считываются из ПЗУ в ОЗУ посредством системной шины ПК. При этом процессор дает команды "перенести блок памяти XX-YY ПЗУ в aa-bb ОЗУ", а сами данные рассматриваются как байты, но не как команды, перемещаются только по материнской плате, и в процессор никак не попадают?

Может ли какая либо микросхема, обеспечивающая при прохождении через себя этого потока данных, распознать их как управляющий код и перенаправить на процессор для выполнение?

Речь не о закладках в микросхемы - там может быть все что угодно.
Речь о схемотехнике компьютера и обработкой ядром Линукса потоков команд и потоков данных.
Есть ли точка на этом пути, где они пересекаются и данные "вдруг" превращаются в команды?

Допустим, на экран информация не выводиться, а анализируется внутри программы.
Могут ли (например ESC-последовательности) нестандартно себя повести на этапе их чтения?

Простите, возможно "дую на воду" и потенциальной опасности от самих программ, принимающих почту, больше (ведь "каким-то образом" файл уже получен системой).
Всегда есть вариант чтения данных из файла посимвольно rf.get(s[k]).

Собственно, вопрос сводиться к правильной реакции на обработку ошибки ввода, в самом худшем случае.
Но возможны ли варианты, когда до этой обработки может дело то и не дойти?

5

volod пишет:

Есть ли точка на этом пути, где они пересекаются и данные "вдруг" превращаются в команды?

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

volod пишет:

Могут ли (например ESC-последовательности) нестандартно себя повести на этапе их чтения?

Начните читать отсюда, а затем по ссылкам: https://ru.wikipedia.org/wiki/%D0%9F%D1 … 1%8B%D1%85

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD, DDR4 32 GB, SSD 500GB + HDD 2TB | Linux Mint 21.3 Cinnamon + Fedora 39 MATE (Compiz) + Windows 11 + macOS 12 Monterey

6

Rizado пишет:

Начните читать отсюда

Data Execution Prevention (DEP) — функция безопасности, встроенная в Linux, Mac OS X, Android и Windows, которая не позволяет приложению исполнять код из области памяти, помеченной как «только для данных».

Благодарю.
Т.е., когда в область памяти будет прочитан исполняемый (уже ранее кем-то созданный) код, это будет просто набор байтов. Теоретически - на интерпретацию (выполнение) он уйти не должен.

7

volod, если сильно боитесь вирусов, переходите на платформу 8051/AVR, там память для данных и программ разделена физически ag .

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD, DDR4 32 GB, SSD 500GB + HDD 2TB | Linux Mint 21.3 Cinnamon + Fedora 39 MATE (Compiz) + Windows 11 + macOS 12 Monterey

8

volod пишет:

Теоретически - на интерпретацию (выполнение) он уйти не должен.

Тут зависит от того что обрабатывает вывод, в данном случае это терминал, а следовательно как сказал bormant он чувствителен к ESC-последовательностям, в которые в некоторых случаях могут привести к нежелательному результату.
Если вывод перенаправляется в файл, то тут нет ни чего страшного.
*** Добавлено: 26.03.2019 20:05:05 ***

Если опасаетесь вирусов, то можно выполнять в sandbox.
Просто выполнить команду sandbox в определенном каталоге, после чего нельзя будет записать ничего выше этого каталога, в каталоге можно менять что угодно. То есть пострадать может только содержимое внутри каталога а выше ни чего. Разве только может удастся повесить систему,в таком случае, но после перезагрузки система будет в порядке.

9

volod пишет:

и
пришлет вместо данных файл с вирусом,
а программа попробует его считать - чем это чревато?

А вы давно видели последний раз вирус под Linux? (именно вирус, а не просто какое-то вредоносное ПО)
Если видели, то: где и когда? как вирус назывался?
*** Добавлено: 08.09.2019 22:24:39 ***

bormant пишет:

А также будут обработаны ESC-последовательности. Не все из них совершенно безобидны.

ESC-последовательности могут быть очень даже "обидны"  bf
Но они не могут быть вредоносны.
Или вы видели?  bm