🤔 Open Source Permissive Licenses
Салют, мы с тобой как то смотрели что такое свободное и проприетарное ПО вот тут, и я думаю, что пора посмотреть более подробно типы пермиссивных лицензий.
Во вложении я привел описание, которое поможет тебе научиться отличать этот вид лицензирования и их особенности, а далее переиспользовать сами sources в условиях их ограничений.
#toolchain #licenses
Салют, мы с тобой как то смотрели что такое свободное и проприетарное ПО вот тут, и я думаю, что пора посмотреть более подробно типы пермиссивных лицензий.
Во вложении я привел описание, которое поможет тебе научиться отличать этот вид лицензирования и их особенности, а далее переиспользовать сами sources в условиях их ограничений.
Итого: напомню, чтобы лицензия считалась “свободной” она должна позволять:
- запускать программу в любых целях
- изучать работу программы и адаптировать её к своим нуждам - доступ к исходному коду
- создавать и распространять копии программы
- улучшать кодовую базу и публиковать улучшения.
#toolchain #licenses
🔥4
🛠 Bandit как linter на pre-commit
Салют,
Давай сегодня посмотрим с тобой на SAST для python. Bandit смотрим как линтер, потому что удобно использовать без разбора и углубления в бизнес логику, потому что инструмент не умеет в это. Тебе же полезен для интеграции в команду разработки на python.
Самое классное, что если использовать wemake-python-styleguide в совокупности с Bandit как анализатором, то мы решаем вопросы разименования, затенения встроенных функций, когнитивной сложность, а также проблемы с непоследовательными возвратами, неправильными разрывами строк, непоследовательными выражениями и сработка с явными уязвимостями.
Команды
Файл конфигурации
Использование как pre-commit
CI/CD
Итого: сам SAST дает AST-подход без исполнения кода, где baseline позволяет внедрять постепенно и расширяем через плагины, но большое количество некорректных правила дающих FP, которые надо перебрать руками. Инструмент легковесен, но не как целевой SAST, а очень комфортное решение для проверок до Merge/ Pull Requeste. Совместно с wemake-python-styleguide решается проблема структуры и стилистики кода внутри команды разработки.
#toolchain #sast
Салют,
Давай сегодня посмотрим с тобой на SAST для python. Bandit смотрим как линтер, потому что удобно использовать без разбора и углубления в бизнес логику, потому что инструмент не умеет в это. Тебе же полезен для интеграции в команду разработки на python.
Bandit парсит код каждого файла проекта в AST (Abstract Syntax Tree - дерево абстрактного синтаксиса) и прогоняет набор правил (плагины через entry points). Тип лицензии: Apache-2.0 license. Форматы отчетов: csv, custom, html, json, screen, txt, xml, yaml.
Самое классное, что если использовать wemake-python-styleguide в совокупности с Bandit как анализатором, то мы решаем вопросы разименования, затенения встроенных функций, когнитивной сложность, а также проблемы с непоследовательными возвратами, неправильными разрывами строк, непоследовательными выражениями и сработка с явными уязвимостями.
Команды
python -m venv .venv
pip install bandit
bandir -r ./my_python_project/ # Рекурсивное сканирование
--severity-level
--confidence-level # Пороги
--profile
-t # Выбор правил
-s # Пропуск правил
nosec # Точечное игнорирование
docker pull ghcr.io/pycqa/bandit/bandit:<tag>
cosign verify ghcr.io/pycqa/bandit/bandit:latest \ # проверка подписи образа перед использованием
--certificate-identity https://github.com/pycqa/bandit/.github/workflows/build-publish-image.yml@refs/tags/<version> \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
Файл конфигурации
# .bandit
exclude_dirs: ['tests', 'venv']
skips: ['B101', 'B311']
any_other_function_with_shell_equals_true:
no_shell: ['subprocess.Popen']
hardcoded_password_string:
hardcoded_password_string_re: '(?i)(password|passwd|pwd)'
Использование как pre-commit
#.pre-commit-config.yaml
repos:
- repo: https://github.com/PyCQA/bandit
rev: 1.7.5
hooks:
- id: bandit
args: ['-ll', '-ii']
CI/CD
variables:
BANDIT_SEVERITY: "medium"
BANDIT_CONFIDENCE: "medium"
BANDIT_OUTDIR: "bandit-report"
bandit_scan:
stage: security
image: ghcr.io/pycqa/bandit/bandit:<tag>
script:
- mkdir -p "$BANDIT_OUTDIR"
- bandit -r . \
--severity-level="$BANDIT_SEVERITY" \
--confidence-level="$BANDIT_CONFIDENCE" \
-f json -o "$BANDIT_OUTDIR/bandit.json"
pipeline {
agent any
options { timestamps() }
environment {
BANDIT_SEVERITY = 'medium'
BANDIT_CONFIDENCE = 'medium'
REPORT_DIR = 'bandit-report'
}
stages {
stage('Setup Python venv') {
steps {
sh '''
python3 -m venv .venv
. .venv/bin/activate
pip install --upgrade pip
pip install bandit
mkdir -p "${REPORT_DIR}"
'''
}
}
stage('Bandit Scan') {
steps {
sh '''
. .venv/bin/activate
bandit -r . --severity-level=${BANDIT_SEVERITY} --confidence-level=${BANDIT_CONFIDENCE} \
-f json -o ${REPORT_DIR}/bandit.json
bandit -r . --severity-level=${BANDIT_SEVERITY} --confidence-level=${BANDIT_CONFIDENCE} \
-f sarif -o ${REPORT_DIR}/bandit.sarif
bandit -r . --severity-level=${BANDIT_SEVERITY} --confidence-level=${BANDIT_CONFIDENCE} \
-f html -o ${REPORT_DIR}/bandit.html
'''
}
}
}
post {
always {
archiveArtifacts artifacts: 'bandit-report/**', fingerprint: true
}
unsuccessful {
script { currentBuild.result = 'UNSTABLE' }
}
}
}
Итого: сам SAST дает AST-подход без исполнения кода, где baseline позволяет внедрять постепенно и расширяем через плагины, но большое количество некорректных правила дающих FP, которые надо перебрать руками. Инструмент легковесен, но не как целевой SAST, а очень комфортное решение для проверок до Merge/ Pull Requeste. Совместно с wemake-python-styleguide решается проблема структуры и стилистики кода внутри команды разработки.
#toolchain #sast
🔥6
Типовые "грешки" использования JWT
Салют,
Тут недавно пересекался с коллегами, с которыми записывали подкаст по безопасной разработке - инфо тут.
Так вышло, что хотел бы поделиться с вами интересным подходом, чем-то напоминает классическую модель. У этих ребят, занимающихся консалтингом и Compliance, есть обзоры в части рисков ИБ по теме уязвимостей в разработке.
Один из интересных постов вот этот. Автор разбирает обход аутентификации в вебе, описывает вектора атак и как минимизировать их. Прочитав вы можете увидеть, что в зависимости от кейса можем акцентироваться на самом принципе и докрутить.
Давай посмотрим на JWT сессии в том же ключе на примере обычного внедрения
Посмотрим на такой кейс, когда используется JWT, но просто реализован механизм выдачи без каких то мер безопасности, что обычно и бывает на практике, так как платят за быструю фичу в проде, что бы работало и легло. Сначала разберем, что это:
Таким образом сам механизм показывает, что мы можем ограничить доступность учетных данных во вне при взаимодействии, например, с контрагентом и нами по API и при этом нам не надо обращаться в БД для валидации напрямую, что растягивает время на исполнение процедуры. Детально можешь почитать тут.
Таким образом мы в явном виде гарантируем, что зашифрованные значения всегда могут помочь сократить риск утечки и взлома пользовательских данных при их перехвате. Также стоит дополнять механизмы специальными методами, такими как:
Получается, что мы имеем access token - доступ при каждом запросе, refresh token - перевыпуск пары, а также указанное значение жизни по time-delay. Сама структура состоит из данных в payload, header как тип и алгоритм шифрования, cripto signature.
Итого: базово механизм реализует только обновление и передачу, но без доп мер защиты могут быть реализованы атаки по типу:
И да, все-таки стоит посмотреть на коллег и их кейсы в AKTIV.CONSULTING @aktivcons.
#reco #reserch #secrets #pmcases
Салют,
Тут недавно пересекался с коллегами, с которыми записывали подкаст по безопасной разработке - инфо тут.
Так вышло, что хотел бы поделиться с вами интересным подходом, чем-то напоминает классическую модель. У этих ребят, занимающихся консалтингом и Compliance, есть обзоры в части рисков ИБ по теме уязвимостей в разработке.
Один из интересных постов вот этот. Автор разбирает обход аутентификации в вебе, описывает вектора атак и как минимизировать их. Прочитав вы можете увидеть, что в зависимости от кейса можем акцентироваться на самом принципе и докрутить.
Давай посмотрим на JWT сессии в том же ключе на примере обычного внедрения
Посмотрим на такой кейс, когда используется JWT, но просто реализован механизм выдачи без каких то мер безопасности, что обычно и бывает на практике, так как платят за быструю фичу в проде, что бы работало и легло. Сначала разберем, что это:
JWT (Json Web Token) токен аутентификации пользовательской сессии, то есть самого пользователя для запросов к методам API. Нужен для передачи учетных данных к серверу на каждый вызываемый метод.
Таким образом сам механизм показывает, что мы можем ограничить доступность учетных данных во вне при взаимодействии, например, с контрагентом и нами по API и при этом нам не надо обращаться в БД для валидации напрямую, что растягивает время на исполнение процедуры. Детально можешь почитать тут.
Таким образом мы в явном виде гарантируем, что зашифрованные значения всегда могут помочь сократить риск утечки и взлома пользовательских данных при их перехвате. Также стоит дополнять механизмы специальными методами, такими как:
- путем ограничения его временем жизни
- валидация изначально проверяет время жизни токена
- blacklist
- защищенный канал передачи данных
- сброс сессии после конца времени жизни токена в неактивном состоянии
- привязка к action button в случае активности пользователя внутри окна аутентифицированного приложения
- дебажить на jwt.io вне команды разработки для тестов ИБ путем модификации
- не передавать чувствительные пользовательские данные (
база
)
- использовать ключевые фразы большой длины и их периодическое изменение
- принудительная смена токенов
- на стороне приложения реализовать белый список разрешенных алгоритмов
- санитизировать полученные от пользователей данные
- мы можем просто отозвать токен в любой момент времени, а после его перевыпустить
- дополнительно можем использовать контроль версии
- усилить схему подписи по модели Эскроу
- покрыть солью (salt) в специфичных случаях
Получается, что мы имеем access token - доступ при каждом запросе, refresh token - перевыпуск пары, а также указанное значение жизни по time-delay. Сама структура состоит из данных в payload, header как тип и алгоритм шифрования, cripto signature.
Итого: базово механизм реализует только обновление и передачу, но без доп мер защиты могут быть реализованы атаки по типу:
- отсутствие проверки подписи, где если поставить alg none, сервер неподписанный токен примет в явном виде с payload и права например admin
- манипуляция ключевыми идентификаторами из-за отсутствия сложности key id
- подбор ключа симметричной подписи и подбор ключевой фразы
- для ассиметричных путем изменения алгоритма через hex с использование логических ошибок реализации
- перехват токена и UrlDecode
И да, все-таки стоит посмотреть на коллег и их кейсы в AKTIV.CONSULTING @aktivcons.
#reco #reserch #secrets #pmcases
🔥6 4
🤔 Нетривиальная база безопасности для Docker
Воу, дошли руки, давай так, я частенько сталкиваюсь с вопросами насчет безопасности контейнеров, в основном это тонкости их настроек.
Не всегда видно не тривиальные вещи, как например из под капота ставится тип сети host, но пока человек не заметит это - профилирование не изменяется при его использовании.
По этой причине я подумал, что для тебя будет полезно сделать основную выжимку для общего понимания на что обращать внимание когда работаешь с Docker.
#reco #containersecurity #secrets
Воу, дошли руки, давай так, я частенько сталкиваюсь с вопросами насчет безопасности контейнеров, в основном это тонкости их настроек.
Не всегда видно не тривиальные вещи, как например из под капота ставится тип сети host, но пока человек не заметит это - профилирование не изменяется при его использовании.
По этой причине я подумал, что для тебя будет полезно сделать основную выжимку для общего понимания на что обращать внимание когда работаешь с Docker.
#reco #containersecurity #secrets
❤🔥5🔥5
🤔 Терминология MITM
Салют,
Подумал, что классно будет увидеть посты с терминологией, которая позволит тебе расширить кругозор и осознаннее подходить к формулировкам.
Будем брать нетиповую базу, как обычно, но все же что-то классическое будем затрагивать. Далее мы будем рассматривать некоторые из них детальнее.
Начнем с атаки "человека по середине" и отметим, что есть такие виды как:
#term #pmcases
Салют,
Подумал, что классно будет увидеть посты с терминологией, которая позволит тебе расширить кругозор и осознаннее подходить к формулировкам.
Будем брать нетиповую базу, как обычно, но все же что-то классическое будем затрагивать. Далее мы будем рассматривать некоторые из них детальнее.
Начнем с атаки "человека по середине" и отметим, что есть такие виды как:
- Подслушивание Wi-Fi
- "Злой двойник"
- Мошенническая точка доступа
- "Человек-в-браузере"
- Перехват сеанса (рассмотрели в примере)
- Сниффинг пакетов
- и тд
#term #pmcases
🔥4❤🔥3 2
🛠 Grype как SCA для артефактов
Салют, сегодня предлагаю посмотреть на еще один open source инструмент для сканирования уязвимостей в образах контейнеров и файловых системах.
Grype используется в связке с Syft
Syft создает список всех зависимостей, который проверяет Grype на наличие уязвимостей. Это позволяет проводить быстрые повторные сканирования без доступа к исходному коду или образу
Применение
Gitlab CI
Jenkins
Итого:
#toolchain #containersecurity #sca #sbom
Салют, сегодня предлагаю посмотреть на еще один open source инструмент для сканирования уязвимостей в образах контейнеров и файловых системах.
Grype работает на уровне артефактов, а не исходного кода и сканирует программные пакеты.
Поддерживает Python, JavaScript (NPM, Yarn), Java, Ruby, Golang, PHP, Rust, .NET. Образы Docker, OCI, Singularity (SIF).
Тип лицензии: Apache 2.0
Форматы отчетов: JSON, SARIF, CycloneDX
Grype используется в связке с Syft
Syft создает список всех зависимостей, который проверяет Grype на наличие уязвимостей. Это позволяет проводить быстрые повторные сканирования без доступа к исходному коду или образу
Применение
curl -sSfL https://get.anchore.io/grype | sh -s -- -b /usr/local/bin # Разворачивание
grype <image:tag> # Сканирование контейнерного образа
grype <image> --scope all-layers # Сканирование с учетом слоев образа
grype dir:path/to/yourproject # Сканирование директории
grype sbom:./sbom.json # Сканирование с использованием SBOM, созданного Syft
grype <image> -o sarif > results.sarif # Сканирование с выводом в SARIF
grype <image> -o json > results.json # Сканирование с выводом в JSON
grype --add-cpes-if-none --distro alpine:3.10 sbom:./sbom.json # Генерация CPE и указание дистрибутива
docker run --rm \ # Запуск сканирования docker
-v /var/run/docker.sock:/var/run/docker.sock \
anchore/grype:latest \
<image:tag>
Gitlab CI
stages:
- security
Syft:
stage: security
image: nixos/nix:latest
script:
- nix-shell -p syft --run "syft ${DOCKER_IMAGE}:latest -o cyclonedx-json=sbom.json"
artifacts:
paths:
- sbom.json
Grype:
stage: security
image: nixos/nix:latest
needs: ["Syft"]
script:
- nix-shell -p grype --run "grype --fail-on high sbom:sbom.json"
Jenkins
pipeline {
agent any
stages {
stage('Grype Scan') {
steps {
sh '''
docker run --rm --volume $(pwd):/tmp/results anchore/grype:latest \
your-image:tag -o json > /tmp/results/grype_report.json
'''
}
}
}
post {
always {
archiveArtifacts artifacts: 'grype_report.json'
}
}
}
Итого:
- локально разработчиком можно использовать для проверки образов перед их отправкой в registry
- имеет интеграции: SARIF, JSON в GitLab Vulnerability Report, DefectDojo, Jira и т.д.
- может сканировать образы контейнеров, файловые системы, docker save и SBOM
- помимо стандартной Severity CVSS, Grype использует EPSS - вероятность эксплуатации и индикатор KEV, чтобы помочь расставить приоритеты
- достаточно часто покрывает false positive, но после исключений срабатывания более точечные если настроить файл .grype.yaml для подавления не влияющих на конкретный проект уязвимостей
- подходит с лету для проектов с Docker-образами и/ или OCI-артефактами
- охватывает и ОС, и языковые пакеты
- политики можно настраивать с помощью флага --fail-on, указывая минимальный уровень Severity, при котором пайплайн должен быть остановлен
- результаты по умолчанию сортируются по Risk Score, но можно изменить сортировку с помощью --sort-by, как пример, по severity, epss, package
#toolchain #containersecurity #sca #sbom
🔥4
🤔 Терминология CyberDefend
Салют, начнем рассматривать базу и как работает бизнес в рамках условий рисков ИБ.
#term #pmcases #riskanalys
Салют, начнем рассматривать базу и как работает бизнес в рамках условий рисков ИБ.
#term #pmcases #riskanalys
🔥3
🤔 Терминология Access Control
Салют, давай закончим день с рассмотрения прав доступа и отдельно вынесем take-grant как классный механизм, он тебе поможет разобраться с nix и понять каким образом работает ролевая модель.
А я плавно вкатываюсь обратно и готовлю классный контент для тебя 🙏
#term #pmcases
Салют, давай закончим день с рассмотрения прав доступа и отдельно вынесем take-grant как классный механизм, он тебе поможет разобраться с nix и понять каким образом работает ролевая модель.
А я плавно вкатываюсь обратно и готовлю классный контент для тебя 🙏
#term #pmcases
🔥6
🛠 Практики DevSecOps для Android
Салют,
Во-первых у нас с тобой классная стата роста, а именно нас уже 200 подписчиков. Я очень рад этому. Спасибо тебе, что отслеживаешь материалы в канале 🙏
Во-вторых, сегодня я хочу поделиться практическим опытом работы с платформой Android и практик DevSecOps для нее.
Думаю вот это точно пригодится тебе и будут аспекты, на которые ты не обращал внимания ранее. Аналогичным образом ты увидишь некоторые аспекты, с которыми можешь быть не согласен, но все же это выжимка.
Практики для Andriod
Итого: если ты будешь частично придерживаться этих методов, то ты сможешь сократить значительное количество проблем для себя и своей команды разработки, потому что такой концепт достаточно снижает уровень рисков ИБ для проекта/ продукта.
#appsec #devsecops #reco #specialty #pmcases
Салют,
Во-первых у нас с тобой классная стата роста, а именно нас уже 200 подписчиков. Я очень рад этому. Спасибо тебе, что отслеживаешь материалы в канале 🙏
Во-вторых, сегодня я хочу поделиться практическим опытом работы с платформой Android и практик DevSecOps для нее.
Думаю вот это точно пригодится тебе и будут аспекты, на которые ты не обращал внимания ранее. Аналогичным образом ты увидишь некоторые аспекты, с которыми можешь быть не согласен, но все же это выжимка.
Практики для Andriod
- Следует исключать возможность хранения конфиденциальной информации во внешних хранилищах: /sdcard, /mnt/sdcard и тд, так как она может быть изменена или прочитана другим приложением, включая внешнее устройство
- При использовании класса ContentProvider должен быть реализован механизм контроля доступа
- Если обмен данными с другими приложениями не требуется, то следует объявить android:exported=”false” в файле манифеста
- export для компонента должен быть помечен как false в файле манифеста, включая ограничение доступа к нему
- Разрешение для ответа вызывающему приложению следует реализовать с использованием методов Context.checkCallingPermission() и Context.enforceCallingPermission()
- Любой URL, полученный через intent, вне доверенной зоны должен быть проверен перед его отображением в WebView
- Для предотвращения возможности перехвата или отказа в обслуживании получатели широковещательных intent должны быть ограничены, а именно:
-- вместо явных intent, следует использовать указание на конкретный компонент, используя setComponent(ComponentName или класс setClass(Context, Class)
-- ограничение трансляции одним приложением с помощью параметра Intent.setPackage() и процессом через Context.sendBroadcast(Intent)
-- после отладки атрибуту android:debuggable должно быть присвоено значение false, чтобы исключить возможность отладки приложения пользователем
-- необходимо исключить предоставление доступа к методу addJavascriptInterface в WebView из-за предполагаемого вредоносного контента
- Метод onGeolocationPermissionsShowPrompt() для геолокации должен запрашивать разрешение
- В SDK необходимо указывать разрешения, так как выходные файлы по умолчанию создаются с правами на чтение
- Необходимо исключить использование loopback при обработке конфиденциальных данных путем использования HttpsURLConnectionclass или SSLSocketclass
- Рекомендуется использовать App Security Practices из документации Android Developers
Итого: если ты будешь частично придерживаться этих методов, то ты сможешь сократить значительное количество проблем для себя и своей команды разработки, потому что такой концепт достаточно снижает уровень рисков ИБ для проекта/ продукта.
#appsec #devsecops #reco #specialty #pmcases
🔥7
🛠 Практики DevSecOps для C
Салют,
Давай сегодня посмотрим с тобой на ООП, со стороны не типовых рекомендаций для C. Я считаю это полезным стартом, особенно когда ты только смотришь в сторону разработки, да и так ты сможешь понять для себя куда лучше двигаться дальше.
Для указателей необходимо учитывать:
А теперь смотри, есть не типовые вещи как рекомендации:
Вот теперь отличия для C#, что именно следует игнорировать:
Итого: такой концепт снижает риски ИБ при работе с кодом на ООП, поэтому соблюдая их и базово понимая принципы их работы сможешь выстраивать процесс разработки качественно, а также это поможет тебе дальше смотреть на подобные моменты при взаимодействии с командой разработки.
#appsec #devsecops #reco #specialty #pmcases
Салют,
Давай сегодня посмотрим с тобой на ООП, со стороны не типовых рекомендаций для C. Я считаю это полезным стартом, особенно когда ты только смотришь в сторону разработки, да и так ты сможешь понять для себя куда лучше двигаться дальше.
Для указателей необходимо учитывать:
- Подделку указателей, где нельзя использовать их не по назначению для доступа, дублирования или изменения переменных объекта
- Адресную арифметику, где осуществляется динамического выделения памяти массиву, что может привести к ошибкам чтения смежных областей памяти
- Висячие указатели, где происходит удаление/ освобождение объекта без изменения значения связанного с ним указателя
- Блуждающие указатели, где запрещено использование указателя без предварительной инициализации для любого состояния, так как аналогичное поведение как у висячих указателях
А теперь смотри, есть не типовые вещи как рекомендации:
- Использование принудительной инициализации указателей для удаления диких указателей
- После удаления указателя необходимо установить его на нулевой или недействительный адрес
- Вместо перебора массива с использованием адресной арифметики необходимо использовать отдельную индексную переменную и проверить, что бы индекс не превышал размер массива
- Использовать Garbage Collector для освобождения памяти, используемую объектами, на которые больше нет ссылок с system.gc, delete
- Контролировать вызов операций суперкласса для исключения type confusion из-за нестрогой проверки типов в языке
- Необходимо исключить использование функций, которые не выполняют проверку границ, таких как strcpy(), strcat(), sprintf(), vsprintf() и gets() с заменой на strncpy(), strncat(), snprintf() и fgets()
- При использовании функций scanf(), scanf(), fscanf(), sscanf(), vscanf(), vsscanf() и vfscanf() должна контролироваться длина
- Необходимо исключить использование функций позволяющих реализовать возможности переполнения буфера: realpath(3), getopt(3), getpass(3), stradd(3), strecpy(3) и strtrns(3)
- Использовать calloc() вместо malloc() для динамического выделения памяти
- Реализовать проверку диапазона целых чисел как часть проверки ввода из-за усечения
- Объявлять переменную как volatile для удаления
- Использовать системный вызов mlock() для UNIX и VirtualLock() для Windows, который предотвращает выгрузку заблокированной памяти на диск
- Использовать IndexOutOfRangeException для отслеживания попыток обращения по некорректному индексу
- Использовать небезопасный контекст с unsafe для работы с указателями, что отключает автоматические проверки безопасности при условии их зачистки после и контроля проверки границ, корректного управление памятью
- Доступ к unsafe строго регламентируется и используется как исключение
- Исключить формирование SQL-запросов путём конкатенации строк
- Делать ориентацию на параметризированные запросы
- Использовать современные криптографические алгоритмы BCrypt или Argon2 с солью и итерациями для хранения хэшей паролей
- Избегать прямого вывода пользовательского ввода
- Стараться использовать контекстно-зависимую очистку
- Использовать потокобезопасные коллекции (ConcurrentDictionary, ConcurrentQueue)
Вот теперь отличия для C#, что именно следует игнорировать:
- Работа с указателями: подделка, висячие и блуждающие указатели, принудительная инициализация, обнуление после удаления
- Адресная арифметика для массивов
- Использование malloc(), calloc(), free(); ручное управление памятью
- Использование функций типа strcpy(), sprintf(), gets(), scanf() и подобных для ввода/вывода
- Системные вызовы mlock() и VirtualLock() (кроме специфичных случаев с секретами)
- Использование volatile для управления удалением объектов
- Проверка type confusion через вызов суперкласса (C# строго типизирован)
Итого: такой концепт снижает риски ИБ при работе с кодом на ООП, поэтому соблюдая их и базово понимая принципы их работы сможешь выстраивать процесс разработки качественно, а также это поможет тебе дальше смотреть на подобные моменты при взаимодействии с командой разработки.
#appsec #devsecops #reco #specialty #pmcases
🔥4
🔥3