Jak wyeliminować typowe luki w łańcuchu dostaw

Nov 29 2022
Z perspektywy cyklu życia oprogramowania (SDLC) bezpieczeństwo jest najważniejszym aspektem działalności biznesowej, ponieważ luki w zabezpieczeniach stanowią zagrożenie dla dużych organizacji mających kontakt z użytkownikami. W rezultacie przedsiębiorstwa dużo inwestują w priorytetowe traktowanie bezpieczeństwa oprogramowania.
Zdjęcie Akinori UEMURA na Unsplash

Z perspektywy cyklu życia oprogramowania (SDLC) bezpieczeństwo jest najważniejszym aspektem działalności biznesowej, ponieważ luki w zabezpieczeniach stanowią zagrożenie dla dużych organizacji mających kontakt z użytkownikami. W rezultacie przedsiębiorstwa dużo inwestują w priorytetowe traktowanie bezpieczeństwa oprogramowania.

Bycie przedsiębiorstwem lub zespołem zorientowanym na prywatność może przynieść wyjątkowe korzyści jako całość. Klienci cenią funkcje bezpieczeństwa oprogramowania, które przedsiębiorstwo buduje i ulepsza tak samo, jak użyteczność. Jednak osiągnięcie kamienia milowego wymaga starannego rozważenia, co ma ścisły wpływ na najlepsze praktyki i wytyczne dotyczące bezpieczeństwa SDLC.

SDLC zawiera punkty kontrolne bezpieczeństwa w celu ochrony poufności, dostępności i integralności całego systemu i danych w nim zawartych. SDLC w połączeniu z modelem dojrzałości oprogramowania OWASP (OWASP SAMM) może pomóc w sformułowaniu i wdrożeniu strategicznego planu bezpieczeństwa aplikacji w całym przedsiębiorstwie.

Co to jest łańcuch dostaw oprogramowania?

Łańcuch dostaw oprogramowania to dyscyplina, która obejmuje zespoły (zarówno wewnętrzne, jak i zewnętrzne), metodologie, narzędzia i najlepsze praktyki w zakresie wprowadzania artefaktów oprogramowania w życie od projektu do wdrożenia.

W ostatnim czasie najbardziej innowacyjne i przełomowe usługi i doświadczenia cyfrowe zostały opracowane przy użyciu oprogramowania open source przez zdalne zespoły.

Biblioteki open source przyciągają programistów swoimi błyszczącymi funkcjami, które umożliwiają inżynierom przyspieszenie rozwoju poprzez skrócenie czasu wprowadzenia na rynek i implikacji kosztowych.

Ale wady i komplikacje pojawiają się w korzystaniu z oprogramowania open source z powodu braku kontroli nad kodem źródłowym i wydawaniem funkcji w miarę upływu czasu wraz z poprawkami, i wiążą się z ryzykiem ataków łańcucha dostaw open source .

Nieodpowiednio opracowany kod z zakodowanymi na stałe sekretami i luźno zaprojektowaną infrastrukturą jest podatny na częste ataki.

Najpopularniejsze luki w zabezpieczeniach

Luki w oprogramowaniu są powszechne w organizacjach na wszystkich poziomach. Początkujące firmy częściej padają ofiarą takich ataków, ponieważ skupiają się na wprowadzaniu nowych funkcji na rynek w krótkich terminach. Niestety, te ekspozycje nie trafiają na pierwsze strony gazet, aby zwiększyć świadomość społeczności technologicznej. Omówmy kilka najbardziej rozpowszechnionych i wpływowych wydarzeń historycznych.

W pewnym momencie wiadomość o ataku na SolarWinds wstrząsnęła światem technologii. Wydarzenie stało się doskonałym przykładem zagrożeń wynikających z nieodpowiednich praktyk bezpieczeństwa.

Katastrofa pojawiła się, gdy stażyście nie udało się ustawić złożonego hasła. Atakujący włamali się do systemu SolarWinds za pomocą słabej kombinacji haseł przy użyciu metody zwanej rozpylaniem haseł i zdołali wypchnąć złośliwe oprogramowanie za pośrednictwem backdoora do wszystkich zależnych przedsiębiorstw. Atak na łańcuch dostaw był oparty na tożsamości, co spowodowało aktualizację serwera aktualizacji SolarWinds.

Egzekwowanie silnych zasad haseł w systemie z dodatkowymi warstwami zabezpieczeń, takimi jak MFA, mogło uniknąć katastrofy.

Podobny incydent miał miejsce w urzędzie certyfikacji rządu Wietnamu. Atakujący ominęli zaporę internetową i wstawili dodatkowe pliki instalacyjne do aplikacji instalacyjnych VGCA, które są aplikacjami skierowanymi do klientów oferowanymi przez VGCA w ramach oferty podpisów cyfrowych.

Ogólna aktywność zakończyła się sukcesem, ponieważ atakujący znaleźli lukę w projekcie strony internetowej, ponieważ ogólny projekt był trochę wadliwy. Ataku backdoorem można było uniknąć dzięki ścisłym ograniczeniom zapory sieciowej, kontroli dostępu i uprzywilejowanym uprawnieniom.

Aby zobaczyć kolejny przykład tego, jak luki w zabezpieczeniach mogą sparaliżować system, spójrzmy na bitcoiny. Bitcoiny można łatwo zdemaskować i ukraść, jeśli usługodawca nie przestrzega wytycznych bezpieczeństwa.

Copay, portfel Bitcoin, został zaatakowany w łańcuchu dostaw, gdy aplikacja mobilna hostująca portfel Bitcoin miała błąd. Błąd w architekturze wynikał z luki w zabezpieczeniach menedżera pakietów narzędzi Javascript o otwartym kodzie źródłowym (NPM). Ta wersja z błędami została upubliczniona i umożliwiła hakerowi zmianę aplikacji w celu załadowania zrefaktoryzowanego kodu i uzyskania dostępu do biblioteki JS.

Błąd mógł zostać wykryty i naprawiony za pomocą narzędzi do skanowania pod kątem luk w potoku kontroli wersji i wdrażania.

Przenoszenie części do zarządzania łańcuchem dostaw oprogramowania

Dobrze wyartykułowany plan, który jest zgodny z solidną dokumentacją, cyberbezpieczeństwem, usuwaniem ryzyka i najlepszymi praktykami w zakresie zarządzania, eliminuje potencjalne luki w zabezpieczeniach i zwiększa bezpieczeństwo łańcucha dostaw oprogramowania. Organizacje muszą dostosować zasady inżynierii „bezpieczne od samego początku” i strategię „przesunięcie w lewo”, aby stworzyć kompleksowy łańcuch narzędzi DevSecOps.

Obraz autorstwa autora

Etap 1: Umiejętność bezpiecznego kodowania

Przede wszystkim przedsiębiorstwa powinny przyjąć wyłączne programy uczenia się i rozwoju w zakresie zarządzania bezpieczeństwem i ryzykiem. W miarę jak zespoły programistów dążą do doskonalenia swoich umiejętności technicznych, wspólnym celem, który powinny dzielić przedsiębiorstwa, są sposoby pomocy programistom w zostaniu mistrzami bezpieczeństwa.

Oceny podatności aplikacji i kursy bezpieczeństwa są potrzebne, aby inżynierowie byli zgodni z celami biznesowymi.

Etap 2: Modelowanie zagrożeń

Niezbędne jest identyfikowanie zagrożeń bezpieczeństwa na długo przed nadrobieniem zaległości rozwojowych i operacyjnych. Ten etap zapewnia zgodność ogólnej strategii projektowania i rozwoju z organizacyjnymi standardami bezpieczeństwa.

Modelowanie zagrożeń zapewnia organizacjom ustrukturyzowane podejście do identyfikowania, analizowania, oceny i łagodzenia ryzyka na wczesnych etapach rozwoju. Modele zagrożeń są obiecujące w zakresie bezpieczeństwa, ponieważ pozwalają programistom i architektom myśleć z punktu widzenia atakującego, umożliwiając im zaplanowanie i zaprojektowanie bezpiecznego systemu.

<?xml version="1.0" encoding="utf-8"?>
<KnowledgeBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <Manifest name="Basic threat modelling design" id="5d3b996b-bac2-8cf6-3b39-617bb67bf042" version="4.1.0.11" author="TwC MSEC" />
 <ThreatMetaData>
   <IsPriorityUsed>true</IsPriorityUsed>
   <IsStatusUsed>false</IsStatusUsed>
   <PropertiesMetaData>
     <ThreatMetaDatum>
       <Name>Title</Name>
       <Label>Title</Label>
       <HideFromUI>false</HideFromUI>
       <Values>
         <Value />
       </Values>
       <Id>5d3b996b-bac2-8cf6-3b39-617bb67bf042</Id>
       <AttributeType>0</AttributeType>
     </ThreatMetaDatum>
     <ThreatMetaDatum>
       <Name>UserThreatShortDescription</Name>
       <Label>Short Description</Label>
       <HideFromUI>true</HideFromUI>
       <Values>
         <Value>Threat modeling is critical and mandate phase in secure software development</Value>
       </Values>
       <Id>ac0f9ea8-aed5-4d95-4ce9-6787124d7b48</Id>
       <AttributeType>1</AttributeType>
     </ThreatMetaDatum>
     <ThreatMetaDatum>
       <Name>UserThreatDescription</Name>
       <Label>Description</Label>
       <HideFromUI>false</HideFromUI>
       <Values>
         <Value />
       </Values>
       <Id>5d3b996b-bac2-8cf6-3b39-617bb67bf042</Id>
       <AttributeType>0</AttributeType>
     </ThreatMetaDatum>
     <ThreatMetaDatum>
       <Name>Priority</Name>
       <Label>Priority</Label>
       <HideFromUI>true</HideFromUI>
       <Values>
         <Value>High</Value>
         <Value>Medium</Value>
         <Value>Low</Value>
       </Values>
       <Description>Priority</Description>
       <Id>ac0f9ea8-aed5-4d95-4ce9-617bb67bf042</Id>
       <AttributeType>1</AttributeType>
     </ThreatMetaDatum>
   </PropertiesMetaData>
 </ThreatMetaData>
 <GenericElements>
   <ElementType>
     <Name>Threat modeling Process</Name>
     <ID>GE.P</ID>
     <Description>General approach to define a threat model</Description>
     <ParentElement>ROOT</ParentElement>
     <Image>Image_ref</Image>
     <Hidden>false</Hidden>
     <Representation>Ellipse</Representation>
     <StrokeThickness>0</StrokeThickness>
     <ImageLocation>Centered</ImageLocation>
     <Attributes>
       <Attribute>
         <Id>002864b3-9a4e-4d21-8a4d-8aea1d2e3056</Id>
         <IsInherited>false</IsInherited>
         <IsOverrided>false</IsOverrided>
         <Name>codeType</Name>
         <DisplayName>Code Type</DisplayName>
         <Mode>Dynamic</Mode>
         <Type>List</Type>
         <Inheritance>Virtual</Inheritance>
         <AttributeValues>
           <Value>Not Selected</Value>
           <Value>Managed</Value>
           <Value>Unmanaged</Value>
         </AttributeValues>
       </Attribute>
     </Attributes>
   </ElementType>
 </StandardElements>
 </KnowledgeBase>

Kod powinien być upoważniony do przeglądu kodu przez rówieśników. Włączenie przeglądów zza ramienia i wiadomości e-mail umożliwia zespołom programistycznym wykrywanie błędów i defektów na wczesnym etapie rozwoju.

Opóźnienia i luki w zabezpieczeniach mogą pojawić się w kodzie nawet przy starannych rozważaniach i ręcznych wysiłkach. Najczęstsze chybienia obejmują brakujące konstrukcje programistyczne, ogólny kod zgodny ze standardami bezpieczeństwa oraz kod, który przechodzi testy kłaczków i podpowiedzi typu.

Przeglądy kodu wspomagane narzędziami są mniej podatne na błędy i zapobiegają zagrożeniom związanym z lukami w zabezpieczeniach. GitHub może okazać się niezawodnym i wydajnym narzędziem do audytów kodu i przeglądów kodu w podróży, z kontrolą wersji jako dodatkową zaletą.

Etap 4: Skanowanie za pomocą zautomatyzowanych narzędzi

Zautomatyzowanie przeglądu kodu przed połączeniem z kodem głównym ma ogromne znaczenie. Nieprzejście wstępnie zdefiniowanych kontroli uwidacznia problemy w kodzie i umożliwia programistom pętlę zwrotną w celu refaktoryzacji i zabezpieczenia całej bazy kodu.

WhiteSource dla programistów, Codacy i Codecov to zautomatyzowane narzędzia do recenzji dostępne za pośrednictwem platformy GitHub, które umożliwiają szybką integrację z bazą kodu i spełnienie wymagań dotyczących stosu technologii. Narzędzia te wykorzystują podejście z przesunięciem w lewo do skanowania i indeksowania wszystkich istniejących repozytoriów GitHub w otwartym kodzie źródłowym.

Etap 5: Statyczne skanowanie kodu i testowanie bezpieczeństwa

Automatyzacja debugowania i przeglądania kodu z pominięciem wykonywania za pośrednictwem potoków może być owocna na etapach kompilacji i wdrażania. Zaawansowane narzędzia do automatyzacji potoków, takie jak Jenkins, są wyposażone w szeroką gamę wtyczek do sprawdzania kodu.

Statyczne wtyczki do przeglądu kodu, takie jak FindBugs, przeprowadzają przegląd i analizę kodu, uruchamiając predefiniowane kontrole i logikę, zwracając plik wyjściowy. Jenkins może przeanalizować plik wyjściowy z zadania, wyróżnić błędy i wyświetlić listę napotkanych ostrzeżeń, stosując podejście odgórne na poziomie katalogu kodu i prezentując szczegółowe podsumowanie ogólnej analizy w formie graficznej.

Próbka kodu:

trigger:
 branches:
   include:
   - feature
   - main
 paths:
   include:
   - src/*
   - tests/*

pool:
 Image: 'centos/latest'

jobs:
- job: codereview
 displayName: review and report

 steps:

 - checkout: self
   lfs: true

 - task: UsePythonVersion@0
   displayName: 'Set Python version to 3.9'
   inputs:
     versionSpec: '3.9'

 - script: pip3 install --user -r requirements.txt
   displayName: 'Installing required dependencies'

 - script: |
     python -m behave --junitxml=./validation_test-checks.xml
   displayName: 'Running behave tests'

 - task: PublishBehaveResults@1
   displayName: 'bumping out behave test results'
   condition: passOrFail()
   inputs:
     testResultsFiles: '**/validation_test-*.xml'
     testRunTitle: 'Publish behave test results for Python $(python.version)'

Luki w łańcuchu dostaw oprogramowania to nieuniknione bestie. Zignorowane mogą spowodować awarię całego systemu, wpływając zarówno na biznes, jak i reputację. SDLC obejmuje liczne techniki i zestawy narzędzi, które sprawiają, że bezpieczeństwo jest głównym kamieniem milowym na drodze do oprogramowania.

Ogólna faza rozwoju musi przebiegać zgodnie z wyżej wymienionymi etapami, począwszy od znajomości zabezpieczeń, modelowania zagrożeń, wzajemnej weryfikacji kodu, automatycznych kontroli kodu oraz statycznego skanowania kodu i testowania bezpieczeństwa.

Od Infosec Writeups: Codziennie w Infosec pojawia się wiele rzeczy, za którymi trudno nadążyć. Dołącz do naszego cotygodniowego biuletynu , aby otrzymywać wszystkie najnowsze trendy Infosec w postaci 5 artykułów, 4 wątków, 3 filmów, 2 repozytoriów GitHub i narzędzi oraz 1 powiadomienie o pracy ZA DARMO!