#c #security #secure-coding #information-hiding
Вопрос:
Вот пример кода для myapp1
и myapp2
:
код myapp1:
int main(int argc, char *argv[])
{
int secret = 123;
char buffer[20];
sprintf(buffer,"%d",secret);
char *argv[] = { "/bin/myapp2", buffer, 0 };
char *envp[] =
{
"HOME=/",
"PATH=/bin:/usr/bin",
0
};
int retval = execve(argv[0], amp;argv[0], envp);
printf("return value is: %dn", retval);
return 0;
}
код myapp2:
int main(int argc, char *argv[])
{
int val = atoi(argv[1]);
some_process(val);
return val;
}
Как вы можете видеть, я вызываю приложение myapp2
, из myapp1
использования execve()
. Я посылаю секретный номер myapp2
в его аргументах.
myapp2
выполняет некоторую обработку и возвращает тот же секретный номер вызывающей программе.
Теперь моя проблема в том, что я хочу, чтобы этот секретный номер был секретным от внешнего мира. секретный номер можно легко взломать с помощью этой ps
команды.
Чего я хочу, так это того, чтобы я был уверен, что myapp2
тот, кто был вызван, является оригинальным. Если кто-то заменит его на a myappfake
, который также возвращает тот же секретный номер, как я узнаю, что меня обманывают?
В принципе, я хочу убедиться , что ответ myapp2
, от которого я получаю ответ, является подлинным.
Комментарии:
1. Почему бы не использовать пару каналов для передачи данных между двумя процессами туда и обратно?
2. Кроме того, либо вы удалили его в своем примере кода, чтобы упростить его, либо вы неправильно понимаете, как
exec*
работает семейство функций. Прежде всего, вам нуженfork
вызов, чтобы иметь возможность запускать первый процесс параллельно. И, во-вторых, даже еслиexecve
бы он был возвращен, он вернул бы индикатор успеха/неудачи самогоexecve
вызова, а не то, что вернул другой запрограммированный.3. Если у кого-то есть полный доступ к машине, вы никоим образом не можете гарантировать такую безопасность. Использование труб лучше, чем передача секретов в виде аргументов, но все равно это только безопасность через неизвестность .
4. Вы могли бы взглянуть на boost boost.org/doc/libs/1_54_0/doc/html/interprocess/… , тогда существуют также решения, зависящие от платформы. RPC-это вариант, но, возможно, излишний для одного номера.
5. @Someprogrammerdude: Общий пример кода предназначен только для упрощения кода. На самом деле myapp1-это модуль ядра Linux. И myap2 вызывается с помощью API call_usermodehelper (). Я думаю, что мы не можем использовать трубы в этом сценарии.
Ответ №1:
Я бы дал вам направление на RPC — удаленный вызов(ы) процедур.
Это старый протокол, но я использую некоторые современные ОС, такие как Linux или Windows.
Этот протокол можно использовать по сети. Таким образом, вы не ограничены местной станцией.
И поскольку Linux и Windows поддерживают локальные (бессерверные) среды, не составляет проблемы протестировать или расширить протокол (также он не ограничен количеством вызовов, которые вы можете совершать).
Вы можете зашифровать или де-зашифровать все данные с каждой стороны (точка приложения). RPC-это старый протокол. Итак, вы должны сами заниматься своими ценными бумагами. И вы можете кодировать свои приложения RPC на разных платформах, потому что протокол RPC не зависит ни от какой платформы (в родной форме). Но вы должны хранить две копии вызовов функций (сервер/клиент). Если вы умны, вы можете расширить свою функцию пакета RPC, расширяясь и не беспокоясь о протоколе. Это всегда одно и то же. Таким образом, вы очень гибки, если хотите расширить свое приложение.