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

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

  1. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    пример забавен ужо одним тем, что дырень была активна в районе 2х летов. а вот иЗЪЧ:crazy: примерр..
    и на аком основание ты делаешь свой выбор 777 Ты тестишь сам используемые либы на предмет дырявости иль просто сообществу доверяешь 7:)
    фанатизм и параноидальность есь несколько не те свойства, кои способны обеспечить безопасность/надёжность :) + помимо сих критериев имеются и прочие, идущие в разрез..

    1. производительность.
    2. энергозатратность.
    +++
    есть ещё, но пока особого смысла про них вспоминать нет.

    Короче говоря, я веду к тому, что рассказы про "безопасное программирование" сейчас во многом лукавы/теоретичны :grin:
     
  2. im.

    im. Active Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    310
    UbIvItS, ты полную чушь пишешь. Даже объяснять тебе не буду. Уже ранее все сказано. Разгонять про Heartbleed это баянище и попса, в данном контексте ни о чем ни говорит. Если хочешь выделиться как-то, то имеешь право, но приведи конкретные примеры по коду со своими объяснениями. Надоели пустые разгоны, как тот же Meltdown, который на практике смешная нелепая чушь.
     
    Последнее редактирование: 25 апр 2018
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    ну, так и приведи пример кода, кой ты считаешь ИДЕАЛОМ :grin: прикол в том, что я встречал кучу разговоров, мол-де проги надо без ошибок писать и ваще. Токь вот я лично таких кодов в живую не встречал :)
     
  4. im.

    im. Active Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    310
    Слушай. Как же ты бесишь. Зацитируй конкретно, где было сказано про "ИДЕАЛ" или балабол.
     
  5. im.

    im. Active Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    310
    Здесь набор инструментов для работы со строками, от самых базовых, до безопасно-ориентированных. Это форк предыдущих наработок оформленных в более легком стиле, и здесь отсутствует централизация как в моем прошлом проекте. Централизация как boost, где все зависит друг от друга ошибочный подход, из собственного опыта.
    P.S. Могут быть ошибки, пока нет времени на развитие, это альфа.
     

    Вложения:

    • str.7z
      Размер файла:
      16,8 КБ
      Просмотров:
      461
  6. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    глянул я и улыбнулся.. вот пример из твоего кода
    Код (Text):
    1. #include "../cfg.h"
    2. #include "../include/lib.h"
    3.  
    4. ///////////////////////////////////////////////////////////////////////////////////////////////////
    5.  
    6. #include "strcpy.h"
    7. #include "strcpy.hpp"
    8.  
    9. ///////////////////////////////////////////////////////////////////////////////////////////////////
    10.  
    11. size_t apilib::strcpy_a(char* dst, const char* src)
    12. {
    13.   return apilib::__strcpy_x<char>(dst, src);
    14. }
    а можь стоило акь-то так написать 777
    Код (Text):
    1.  
    2. size_t apilib::strcpy_a(char* dst, const char* src)
    3. {
    4. int lngth=strlen(src);
    5. char *buff=new char[lngth];
    6. if (buff == NULL){
    7.    printf("string is too long\n");
    8. return 0;
    9. }
    10. dst=buff;
    11.   return apilib::__strcpy_x<char>(dst, src);
    12. }
    акь видишь == тожь не идеал:blush2: но во всяком случае не будет переполнения буфера дажь на подлой сишечке:crazy: :):grin:
     
  7. im.

    im. Active Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    310
    UbIvItS,
    strdup_a имеется, от переполнений есть процедурки с литерами 'l' и 'n' в постфиксе, например strlen_na, strcpy_la и пр.
    общий подход для 'l' процедур это возвращать размер сигнализирующий о переполнении, т.е. превышающий maxcnt, maxsize на входе, при этом переполнение избегается ессно.
     
  8. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    любая функа копирования должна явно обрабатывать сю ситюЁвину.
     
  9. im.

    im. Active Member

    Публикаций:
    0
    Регистрация:
    16 сен 2017
    Сообщения:
    310
    UbIvItS, каждая процедура имеет свои обязательства, обычные strcpy нужны для работы со статическими размерами, там где абсолютно не требуется проверка на переполнение, таких ситуаций полно при форматировании текста и указывать размеры буфера там вообще ни к месту, работают эти процедуры быстрее. Для работы с данными получаемыми из вне, где возможно переполнение были придуманы процедуры с литерой 'n', их есть два варианта, те что копируют 'n' из source и те, что пишут 'n' в destination (и не более чем 'n'), позже для безопасного кодинга запилены процедуры с литерой 'l', которые в отличии от 'n' имеют обязательства о сигнализации нарушения в работе процедуры с сохранением контекста без сбоя, т.е. они говорят о наличии переполнения не разрушая ничего в работе. Отличие всех подходов в зоне ответственности и обязательствах, чем выше секурность, тем шире обязательства. Ничего тут не надо доказывать. Все программирование строится на базовых допущениях и уровнях абстракции. Ерундой можно заниматься до такой степени, что будешь в каждую strcpy пихать IsBadReadPtr и VirtualQuery для проверки аттрибутов участка памяти. В стандартных решениях, где нет проверки на NULL-указатели, там корректность входящих данных должна проверяться кодером, но так как это не всегда возможно сделать грамотно и по месту, то и возникают сбои, и вот поэтому ответственность перекладывается с плеч кодера на 'n' и 'l' решения, никакой магии, это УПРАВЛЕНИЕ, классическое УПРАВЛЕНИЕ.
     
  10. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    то есть никому не придёт в голову устроить сим функам переполнение 777 :)
     
  11. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Вы про такое понятие, как "контракт" слышали? Мы делаем спецификацию функции, где явно указываем, что она не осуществляет проверок на переполнение, то есть возлагаем ответственность делать проверки на вызывающий код. Благодаря этому последовательность вызовов данной функции будет работать быстрее, так как проверки отсутствуют.
    Если разработчик баран и не следует контракту - то увы и ах.
     
  12. UbIvItS

    UbIvItS Well-Known Member

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

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Вообще-то, это не инновации, а старо как мир. Каждая функция сопровождается документацией, что с ней можно делать, а что - нет. Если вас не устраивает отсутствие проверок - либо ищите другую либу, либо реализуйте дополнительную прослойку, которая будет эти проверки делать.
    Но помните о законе дырявых абстракций: http://russian.joelonsoftware.com/Articles/LeakyAbstractions.html
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    SadKo, в конце-то концов запуск кода с переполнением буфера в большинстве случаев стоит дороже..

    1. либо эксплойтик подогнали.
    2. включена в оси защита стека и куда подевается скорость небезопасной функи 7:)
    3. работа аверок опять сжирает весь выигрыш.
    +++
    единственный, пожалуй, вариант для подобных финтов есь буст в мат. моделях без доступа к ним всякой токсичной публики. Но и тамо оно весьма спорное :)
     
  15. im.

    im. Active Member

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

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

    Проверки нужны там, где они нужны, а не там где теоретически можно пронести автомат в дверь, потому чторазмер двери это позволяет сделать.
     
  16. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    акь минимум еть даёт возможность обрушить работу кода. Вообще, приведи пример, пожалуйста, такой статики :)
     
  17. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    А ну-ка обрушьте-ка мне функцию 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.  
     
  18. UbIvItS

    UbIvItS Well-Known Member

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

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

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

    im. Active Member

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

    Код (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