Что такое безопасное программирование ?

Тема в разделе "WASM.ZEN", создана пользователем X-Shar, 17 фев 2018.

  1. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.401
    Адрес:
    г. Санкт-Петербург
    А ну-ка обрушьте-ка мне функцию strcat, пожалуйста, используемую в указанном контексте функции join:
    Код (C):
    1.  
    2.  
    3. /* Копирует строку s в конце p, возвращает указатель на конец строки p после модификации, специальных проверок указателей нет */
    4. char *strcat(char *p, const char *s)
    5. {
    6.    while (*p) p++;
    7.    while (*(p++) = *(s++)) ;
    8.    return --p;
    9. }
    10.  
    11. /* Аргументы - массив си-строк, каждый элемент отличен от NULL,
    12.    count - размер массива
    13.    Функция возвращает указатель на начало сформированной си-строки,
    14.    полученный указатель после использования необходимо освободить
    15.    при помощи вызова free()
    16.  */
    17. char *join(char **list, int count)
    18. {
    19.     size_t length = 1;
    20.     for (size_t i=0; i<count; ++i)
    21.         length += strlen(list[i]);
    22.  
    23.     char *res = (char *)malloc(length);
    24.     res[0] = '\0';
    25.     char *p = res;
    26.  
    27.     for (size_t i=0; i<count; ++i)
    28.         p = strcat(list[i]);
    29.  
    30.     return res;
    31. }
    32.  
    33.  
     
  2. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    SadKo, хмм.. это на шутку смахивает :)
    буферок ни разу не статичный :grin: код может, правда, вылететь, если res == NULL.
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.401
    Адрес:
    г. Санкт-Петербург
    Вы мне strcat обрушьте, а не join. Код писался специально для вас, за 5 минут, поэтому проверку забыл вставить для malloc.
     
  4. im.

    im. Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    156
    Нужно заканчивать этот флуд, засрали тему уйдя куда-то в сторону.
    Я выложил исходники написанные с оглядкой на "безопасное программирование".

    Код (C):
    1.   template<typename X>
    2.   inline size_t __strlen_x(const X* string)
    3.   {
    4.     if(!string)
    5.     {
    6.       return 0;
    7.     }
    8.  
    9.     size_t length = 0;
    10.  
    11.     while( string[length] != '\0' )
    12.     {
    13.       length += 1;
    14.     }
    15.  
    16.     return length;
    17.   }
    Здесь делано таким образом, чтобы код компилировался в голове, исключены намерено грязные техники с инкрементом length++, запихивание сложных конструкций в одну строку и пр.
    А все процедуры выстраиваются от примитивов к более сложным постепенно, в попытках не выходить за пределы 100 строчек на 1 процедуру, разбивая нечто сложное на примитивы.
    Шаблонизация используется как замена макросов с возможностью специализации под кастомные типы в случае каких-то исключительных ситуаций.

    То о чем говорит UbIvItS не относится явно к безопасному программированию, это тема какой-то параноидальной психологии программера, который сдвинут на "секурности". А это очень разные вещи - пытаться писать безопасный понятный код и пытаться писать код который будет удовлетворять фантомные страхи автора.

    Пример процедуры для безопасного подсчета длины Z-строки.
    Код (C):
    1.   template<typename X>
    2.   inline size_t __strlen_nx(const X* string, size_t maxlen)
    3.   {
    4.     if(!string || !maxlen)
    5.     {
    6.       return 0;
    7.     }
    8.  
    9.     size_t length = 0;
    10.     size_t zindex = maxlen - 1;
    11.  
    12.     while( length < zindex && string[length] != '\0' )
    13.     {
    14.       length += 1;
    15.     }
    16.  
    17.     return length;
    18.   }
    Конкретно в PE заголовке имя секции это строка, но она не Z-строка, а 8 байт, которые могут полностью использоваться без завершения нулём.
     
    Последнее редактирование: 26 апр 2018
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    это несколько лукавое предложение :) strcat в данном случае является неотъемлемой частью join, тч обрушить его эксплойтиком не получится.
    это с аких пор переполнение буфера стало "фантомными страхами" 777 :) либо оно в коде есть, либо его в коде нет -- 3го нет :grin: к тому же, твоё утв (мол-де допущение таких ансейф фунок в коде) способствует ускорению кода весьма сомнительно..

    1. защита стека осью есь ТОРМОЗА.
    2. добавление канарок компилем есь опять ТОРМОЗА.
    3. аверки == ещё одни ТОРМОЗА.
    ***
    Итого-сь получаем == overflow-free buffer даёт реальный буст кодам + увеличивает их устойчивость и безопасность.
     
  6. im.

    im. Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    156
    UbIvItS, либо оно в коде есть, либо его нет, если ты его не сможешь спровоцировать входными данными, то его нет верно?
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    простой пример: твою либу аки-она-есть взяли для интерпретатора скриптов и благодаря ей (твоей либе) в интерпретаторе появляется buffer overrun чрез скриптики.
     
  8. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.401
    Адрес:
    г. Санкт-Петербург
    Ну, то есть, вы согласны с тем, что я безопасно использую strcat, соблюдая контракт, который был описан в комментарии к функции?

    Не весьма и не сомнительно. Лишний бранч - минус 10 тактов процессора. Если бранчей будет много, то сами посмотрите, сколько тактов вы проиграете. При этом, в большинств случаев бранч можно реализовать в вызывающем коде один раз, что значительно увеличит производительность.

    Вы не путайте внутренний API и внешний API. Если API внешний, то там надо применять весь спектр защит. А если API внутренний - то смысла защищаться нет, достаточно досконально описать его поведение.

    Чего-чего добавление???

    Аверки не нужны. Это костыль, призванный защитить от дырявого API.

    Правильный дизайн приложения даёт реальный буст кодам и увеличивает их устойчивость и безопасность. А что внутри будет использоваться - всё равно.
     
  9. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    небезопасная функа можь быть определена чрез #define и в бинарных кодах её не будет от слова СОВСЕМ :grin: + Ты в общем и целом привёл частный случай. а в большинстве вариаций небезопасная функа остаётся небезопасной. Опять же простой пример: твоя прога должна поддерживать аддоны чрез скриптики.
    хмм.. еть чрезвычайно оптимистично :) при кодах без переполнения буфера можно отключать защиту стека/ASLR/прочую крень. а тамо тиков-таков поболей.. сильно поболей.
    вот ЫмЭнно == достаточно исключить наиболее вопиющие косяки в изначальном коде, а потом ненужна будет туева хуча костылей. И тута совсем неважно внутренний апи иль внешний.. к тому же, столь строгое разграничение не всегда достижимо.
    https://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries
    так о том и речь :)
    целостность подхода как раз-таки и требует чётко реализовать потроха, дабы хвосты не торчали, за кои можно потянуть :grin:
     
  10. im.

    im. Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    156
    Это не пример, это плод твоего воображения.

    Код (C):
    1.   /**
    2.    * Копирование строки.
    3.    *
    4.    * @param dst     конечная строка.
    5.    * @param src     исходная строка.
    6.    * @param maxlen  максимальная длина конечной строки с учетом нулевого символа.
    7.    *
    8.    * @return  требуемая длина конечной строки без учета нулевого символа,
    9.    *          требуемая длина >= maxlen означает недостаточный размер буфера,
    10.    *          0 в случае ошибки.
    11.   */
    12.   size_t strcpy_la(char* dst, const char* src, size_t maxlen);
    13.   size_t strcpy_lw(wchar_t* dst, const wchar_t* src, size_t maxlen);
    14.  
    15.   /**
    16.    * Копирование строки.
    17.    *
    18.    * @param dst     конечная строка.
    19.    * @param src     исходная строка.
    20.    * @param maxlen  максимальная длина конечной строки с учетом нулевого символа.
    21.    * @param maxcnt  максимальное количество копируемых символов исходной строки.
    22.    *
    23.    * @return  требуемая длина конечной строки без учета нулевого символа,
    24.    *          требуемая длина >= maxlen означает недостаточный размер буфера,
    25.    *          0 в случае ошибки.
    26.   */
    27.   size_t strcpy_lna(char* dst, const char* src, size_t maxlen, size_t maxcnt);
    28.   size_t strcpy_lnw(wchar_t* dst, const wchar_t* src, size_t maxlen, size_t maxcnt);
    Безусловно если рукожоп возьмет какую-то либу, не обязательно эту конкретную, и он максимум знает синтаксис языка, при том ничего не слышал о технических требованиях и задачах, то конечно он может понаписать гавнокода. Однако в руках разработчика, который имеет хотя бы базовые навыки, не составит труда выбрать именно тот инструмент из представленного набора, который соответствует техническим требованиям.

    Меня удивляют столь абсурдные примеры и нелепые утверждения от человека, который знаком с WASM более 5 лет. Неужели ты всего этого не знаешь на полном серьезе? Уже порядка двух страниц ты пытаешься убедить людей в том, что ты сам придумал потому, что хочешь поспорить ради того, чтобы поспорить. Мне уже жалко тратить время, так как это бессмысленно что-то объяснять и делиться опытом.
     
    Последнее редактирование: 27 апр 2018
  11. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    Тебе показать печальную статистику 777 :) https://www.cyber-security.ro/blog/2018/02/12/cloudme-sync-1-10-9-remote-buffer-overflow/
    И казалось бы, еть ужо 2018 :) кстати, практика отключения костылей по защите стека весьма живая, ибо уж очень заметен подъём производительности компа + портабельность кодов улучшается :grin:
     
  12. im.

    im. Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    156
    :acute:@UbIvItS, а где собственно статистика?
     
  13. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    https://packetstormsecurity.com/files/tags/overflow некие сводные графики искать не буду, но списки и даты уж:crazy: говорят сами за себя :grin:
     
  14. im.

    im. Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    156
    UbIvItS, понятно, статистики нет судя по всему, хоть проверяй в следующий раз, чтобы так в лужу не садиться :grin:
     
  15. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.401
    Адрес:
    г. Санкт-Петербург
    UbIvItS, в общем, не знаю, что вы там себе возомнили, но всё звучит как какой-то бред.
    Опытный разработчик грабли аккуратно обойдёт, нуб наступит на грабли даже там, где их нет. Не вижу смысла дальше что-то обсуждать.
     
  16. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    upload_2018-4-28_12-33-56.png
    https://www.ptsecurity.com/upload/corporate/ww-en/analytics/WebApp-Vulnerabilities-2017-Q4-rus.pdf
    скриптики дажь при идеальном интерпретаторе == вещь крайне подлая и гнусная :)
     
  17. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.401
    Адрес:
    г. Санкт-Петербург
    Проблема не в скриптиках, а в тех, кто эти скриптики пишет. Ваша статистика это ещё раз подтверждает.
     
  18. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    перво-наперво, всё же стоит учитывать, что любой код/решение/устройство == еть Диавольский клубок компромиссов. а в скриптах обеспечить качественный уровень защиты действительно сложно: дажь элементарное разграничение меж рид-онли и экзе мод тамо весьма сумрачное.. cat /path/to/readOnly.sh|sed $cmd|bash иль та же команда source, + ещё есть весьма годная фича акь отсутствие жёсткого типа переменной, что способствует массе логических сюрпризов. Но при этом скриптики крайне удобная чертовщина в хозяйстве :)
     
  19. im.

    im. Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    156
    UbIvItS, Ты так сильно уперт на своей позиции. Представленный выше кусочек сыра это неаргумент. Здесь необходимо сопоставлять количество Lines of Code с количеством найденных ошибок, по годам, как это например сделано в книге Хоглунда "Взлом программного обеспечения", как раз на полке стоит, поглядываю на нее и вспоминаю оттуда примеры. Так вот учитывая популяризацию разработки ПО, количество критических багов не так и велико, по отношению на строчки кода тенденция идет на снижение, это говорил Крис Касперски при жизни. Публично или в личных беседах не могу сказать, но точно говорил опираясь на свой опыт.

    Лучше расскажи чем ты сам занимаешься, интересно откуда у тебя такие критические взгляды на вещи и как они влияют на твою собственную жизнь.
     
  20. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    3.633
    а что ты понимаешь под выражением "критический баг" ???:blush2: