Введение
Обеспечение качества программного обеспечения (SwA) — это критически важный процесс в разработке программного обеспечения, обеспечивающий надежность, безопасность и защищенность программных продуктов. Он включает в себя различные виды деятельности, такие как анализ требований, анализ проекта, инспекция кода, тестирование и формальная верификация. Одним из ключевых компонентов обеспечения качества программного обеспечения является безопасное кодирование, которое следует общепринятым отраслевым стандартам и лучшим практикам, например, тем, что определены Институтом инженерии программного обеспечения (SEI) в стандартах CERT Secure Coding Standards (SCS). Другим важным аспектом обеспечения качества программного обеспечения является тестирование, которое должно проводиться на различных этапах процесса разработки программного обеспечения и может включать функциональное тестирование, нагрузочное тестирование и тестирование безопасности. Тестирование помогает выявить дефекты или уязвимости в программных продуктах до их выпуска. Кроме того, обеспечение качества программного обеспечения включает организационные и управленческие практики, такие как управление рисками и управление качеством, чтобы гарантировать соответствие программных продуктов потребностям и ожиданиям заинтересованных сторон. Целью обеспечения качества программного обеспечения является создание программного обеспечения, свободного от уязвимостей и функционирующего в соответствии с назначением, в соответствии со всеми требованиями и стандартами, регулирующими процесс разработки программного обеспечения. [3] Кроме того, обеспечение качества программного обеспечения направлено на создание программно-интенсивных систем, обладающих повышенной безопасностью. Для достижения этой цели требуется превентивный динамический и статический анализ потенциальных уязвимостей, а также рекомендуется целостное системное понимание. Архитектурный анализ рисков играет важную роль в любой программе безопасности программного обеспечения, поскольку ошибки проектирования составляют 50% проблем безопасности, и их невозможно обнаружить, просто просматривая код. Соблюдая общепринятые отраслевые стандарты и лучшие практики, внедряя методы тестирования и управления, а также проводя архитектурный анализ рисков, обеспечение качества программного обеспечения может минимизировать риск сбоев системы и нарушений безопасности, что делает его критически важным аспектом разработки программного обеспечения.
Почему важно обеспечить безопасность программного обеспечения?
В современном цифровом мире программное обеспечение используется для управления широким спектром устройств и систем, включая автомобили, медицинские приборы, финансовые системы и военную технику. Поэтому обеспечение надежности, безопасности и защищенности программных продуктов имеет решающее значение. Без надлежащего тестирования и верификации программное обеспечение может содержать дефекты и уязвимости, которые могут привести к сбоям в работе системы, нарушениям безопасности и другим серьезным проблемам с негативными последствиями для отдельных лиц, предприятий и общества в целом. Национальный институт стандартов и технологий (NIST) определяет обеспечение качества программного обеспечения как "уровень уверенности в том, что программное обеспечение не содержит уязвимостей, намеренно внедренных в программное обеспечение или случайно возникших на любом этапе его жизненного цикла, и что программное обеспечение функционирует в соответствии с назначением" [22]. Организации могут снизить риск дорогостоящих сбоев системы, утечек данных и других неблагоприятных последствий, обеспечивая качество программного обеспечения. Помимо потенциальных рисков, связанных с дефектами и уязвимостями программного обеспечения, существуют юридические и нормативные требования, касающиеся обеспечения качества программного обеспечения. Несоблюдение этих требований может повлечь за собой юридические и финансовые санкции. Например, организации, разрабатывающие программное обеспечение для определенных отраслей, могут подпадать под действие правил, требующих от них обеспечения безопасности и защищенности своей продукции. Многие критически важные функции, такие как национальная оборона, банковское дело, здравоохранение, телекоммуникации, авиация и контроль над опасными материалами, зависят от корректной и предсказуемой работы программного обеспечения. В случае сбоя программно-интенсивных систем, поддерживающих эти виды деятельности, может произойти серьезный срыв. Поэтому организациям необходимо внедрять методы и инструменты тестирования и верификации программного обеспечения для снижения риска сбоев системы и нарушений безопасности.
Исполнение
Обеспечение качества программного обеспечения осуществляется посредством ряда мероприятий, направленных на обеспечение надежности, безопасности и защищенности программных продуктов. Эти мероприятия включают анализ требований, обзоры проектирования, проверки кода, тестирование и формальную верификацию. [1]
Анализ требований предполагает выявление и определение функциональных и нефункциональных требований к программному продукту. Это включает в себя понимание назначения программного обеспечения, его целевых пользователей и любых применимых стандартов или нормативных требований, которым необходимо соответствовать. Обзоры проектирования включают в себя оценку проекта программного обеспечения для обеспечения соответствия требованиям и возможности его реализации. Это включает в себя проверку на наличие дефектов, ошибок или упущений в проектировании, которые могут повлиять на надежность, безопасность или защищенность программного обеспечения. [24]
Проверки кода включают в себя анализ кода для обеспечения его соответствия общепринятым отраслевым стандартам и лучшим практикам. Это включает в себя проверку качества кода, читаемости и поддерживаемости, а также выявление потенциальных уязвимостей или проблем безопасности. [2]
Тестирование включает в себя выполнение программного обеспечения для выявления дефектов или уязвимостей, которые могут повлиять на его надежность, безопасность или защищенность. Это включает в себя функциональное тестирование, тестирование производительности и тестирование безопасности, среди прочих видов тестирования. [3]
Формальная верификация включает в себя использование математических или логических методов для доказательства того, что программное обеспечение работает в соответствии с заданными спецификациями и не содержит дефектов или уязвимостей. Это включает в себя такие методы, как проверка моделей, доказательство теорем и статический анализ. [1]
Техника
Тестирование и проверка программного обеспечения – это методы, используемые для выявления и устранения дефектов и уязвимостей в программном коде. Существует несколько типов методов тестирования и проверки, включая функциональное тестирование, тестирование производительности и тестирование безопасности. [3] Машинное обучение все чаще используется в обеспечении качества программного обеспечения для обнаружения программных проблем. Благодаря способности анализировать большие объемы данных, машинное обучение может выявлять закономерности и аномалии, которые могут остаться незамеченными человеком. Использование машинного обучения может в конечном итоге улучшить качество и безопасность программного обеспечения. Функциональное тестирование используется для обеспечения того, чтобы программное обеспечение выполняло функции, для которых оно предназначено. Этот тип тестирования включает запуск программного обеспечения и проверку его функций и функциональности, чтобы убедиться, что оно работает как ожидается. [4]
Machine learning is increasingly used in software assurance to detect software problems. With the ability to analyze large volumes of data, machine learning can identify patterns and anomalies that may go unnoticed by humans. The use of machine learning can ultimately improve the quality and security of software. Functional testing is used to ensure that the software performs the functions it is intended to perform. This type of testing involves running the software and testing its features and functionality to ensure that it works as expected. [4]
Тестирование производительности используется для измерения скорости, отзывчивости и стабильности программного обеспечения. Этот тип тестирования включает моделирование реальных сценариев для обеспечения способности программного обеспечения справляться с нагрузкой и эффективно работать в различных условиях. [4]
Тестирование безопасности используется для выявления уязвимостей и слабых мест в программном обеспечении, которые могут быть использованы злоумышленниками. Этот тип тестирования включает использование различных методов для попытки взломать систему безопасности программного обеспечения, таких как тестирование на проникновение и сканирование уязвимостей. [3]
Помимо тестирования, используются методы проверки для обеспечения корректности и отсутствия дефектов в коде программного обеспечения. Это включает в себя такие методы, как анализ кода, формальная проверка и статический анализ. [1]
Анализ кода включает проверку кода на соответствие общепринятым отраслевым стандартам и лучшим практикам. Это включает проверку качества кода, читаемости и поддерживаемости, а также выявление потенциальных уязвимостей или проблем безопасности. [2]
Формальная проверка включает использование математических или логических методов для доказательства того, что программное обеспечение работает в соответствии с заданными требованиями и не содержит дефектов или уязвимостей. Это включает в себя такие методы, как проверка моделей, доказательство теорем и статический анализ. [1]
Статический анализ включает анализ программного кода без его выполнения для выявления потенциальных дефектов или уязвимостей. Это включает в себя использование инструментов анализа кода и инспекции кода. [2]
Инструменты
Инструменты тестирования и проверки программного обеспечения используются для выявления и устранения дефектов и уязвимостей в программном коде. Существует несколько типов инструментов тестирования и проверки, в том числе:
Искусственный интеллект (ИИ) все чаще используется в обеспечении качества программного обеспечения для выявления и устранения дефектов и уязвимостей в программном коде. Методы ИИ, такие как машинное обучение и обработка естественного языка, могут использоваться для автоматизации процессов тестирования и проверки, делая их более быстрыми и эффективными. Инструменты статического анализа: эти инструменты анализируют исходный код программного приложения без его выполнения, чтобы выявить потенциальные дефекты или уязвимости. Инструменты статического анализа могут использоваться для обнаружения проблем, связанных с качеством кода, безопасностью и соответствием стандартам кодирования. Инструменты динамического анализа: эти инструменты анализируют поведение программного приложения во время его работы, чтобы выявить дефекты или уязвимости, которые могут быть не очевидны в исходном коде. Инструменты динамического анализа могут использоваться для обнаружения проблем, связанных с производительностью, использованием памяти и безопасностью. [25]
Инструменты фаззинга: эти инструменты генерируют случайные входные данные для программного приложения, чтобы проверить его устойчивость к неожиданным или некорректным данным. Инструменты фаззинга могут использоваться для обнаружения проблем, связанных с проверкой входных данных, управлением памятью и безопасностью. [25]
Инструменты тестирования на проникновение: эти инструменты имитируют атаки на программное приложение, чтобы выявить уязвимости, которые могут быть использованы злоумышленниками. Инструменты тестирования на проникновение могут использоваться для обнаружения проблем, связанных с безопасностью, таких как SQL-инъекции, межсайтовый скриптинг и переполнение буфера. Инструменты управления тестированием: эти инструменты используются для управления процессом тестирования программного обеспечения, включая создание, выполнение и формирование отчетов о тестовых примерах. Инструменты управления тестированием могут помочь обеспечить проведение всех необходимых тестов, отслеживание и устранение дефектов. [24]
Artificial intelligence (AI) is increasingly being used in software assurance to identify and address defects and vulnerabilities in software code. AI techniques such as machine learning and natural language processing can be used to automate testing and verification processes, making them faster and more efficient. Static analysis tools: These tools analyze the source code of a software application without executing it, to identify potential defects or vulnerabilities. Static analysis tools can be used to detect issues related to code quality, security, and compliance with coding standards. Dynamic analysis tools: These tools analyze the behavior of a software application while it is running, to identify defects or vulnerabilities that may not be apparent in the source code. Dynamic analysis tools can be used to detect issues related to performance, memory usage, and security. [25]
Fuzz testing tools: These tools generate random input to a software application, to test its resilience to unexpected or malformed data. Fuzz testing tools can be used to detect issues related to input validation, memory management, and security. [25]
Penetration testing tools: These tools simulate attacks on a software application, to identify vulnerabilities that could be exploited by attackers. Penetration testing tools can be used to detect issues related to security, such as SQL injection, cross site scripting, and buffer overflows. Test management tools: These tools are used to manage the software testing process, including test case creation, execution, and reporting. Test management tools can help to ensure that all required tests are conducted, and that defects are tracked and resolved. [24]
Министерство обороны США (DoD)
Для Министерства обороны SwA определяется как "уровень уверенности в том, что программное обеспечение функционирует исключительно в соответствии с назначением и не содержит уязвимостей, намеренно или непреднамеренно разработанных или внедрённых в его состав на протяжении всего жизненного цикла. Министерство обороны развивает SwA как надёжную практику системной инженерии, что подтверждается двумя недавними публикациями, финансируемыми JFAC, разработка которых велась Институтом инженерии программного обеспечения (SEI) и экспертами-практиками из различных видов вооружённых сил и АНБ. Руководство по SwA для руководителей программ демонстрирует, как следует планировать, обеспечивать ресурсами и управлять SwA, а Руководство по SwA для разработчиков рекомендует адаптируемые технические практики на протяжении всего жизненного цикла. Оба этих документа являются первыми в своём роде и отмечены наградами. Две организации в масштабе предприятия в Министерстве обороны, занимающиеся развитием возможностей SwA, – это Совместный федеральный центр обеспечения (JFAC) и Сообщество практики DoD SwA, которое функционирует как ежеквартальный коллегиальный форум, проведший 32 последовательные встречи. Оба центра открыты для других ведомств правительства США. Устав JFAC доступен на его веб-сайте. Для повышения осведомлённости о существующих на рынке семействах инструментов SwA, JFAC профинансировал Институт оборонного анализа (IDA) для создания ресурса State of the Art Resource (SOAR). Недавним нововведением в области "встраивания" SwA на протяжении всего жизненного цикла является сопоставление выбранных средств контроля NIST 800-53 с инженерными задачами, чтобы результаты инженерных работ определяли структуру управления рисками (RMF) и обеспечивали получение разрешения на эксплуатацию (ATO). На веб-сайте JFAC доступен пакет, включающий описания элементов данных (DID), машиночитаемые форматы отчётов об уязвимостях и краткий обзор применения соответствующих методов. Другие прорывные инновации находятся в разработке.
Национальное управление по аэронавтике и космосу (NASA)
Согласно NASA, обеспечение качества программного обеспечения — это "заранее спланированный и систематический набор действий, гарантирующий соответствие программных процессов и продуктов требованиям, стандартам и процедурам. Оно включает в себя такие области, как обеспечение качества, инженерия качества, верификация и валидация, сообщение о несоответствиях и корректирующие действия, обеспечение безопасности и обеспечение защищенности, а также их применение на протяжении жизненного цикла программного обеспечения". В стандарте NASA по обеспечению качества программного обеспечения также указано: "Применение этих областей в течение жизненного цикла разработки программного обеспечения называется обеспечением качества программного обеспечения".
Форум по обеспечению качества программного обеспечения для достижения высоких результатов в области кодирования (SAFECode)
Согласно SAFECode, обеспечение уверенности в качестве программного обеспечения — это «уверенность в том, что программное обеспечение, аппаратное обеспечение и услуги не содержат преднамеренных и непреднамеренных уязвимостей и что программное обеспечение функционирует должным образом».