앱 보안의 첫 번째 규칙 : 공격자가 물리적 또는 전자적으로 제한없이 액세스 할 수있는 모든 머신은 이제 실제 위치 또는 비용에 관계없이 공격자에게 속합니다.
앱 보안의 두 번째 규칙 : 침입자가 침투 할 수없는 물리적 경계를 벗어나는 소프트웨어는 이제 코딩에 소요 된 시간에 관계없이 공격자의 소유입니다.
세 번째 규칙 : 공격자가 침투 할 수없는 동일한 물리적 경계를 벗어나는 정보는 사용자에게 아무리 가치가 있어도 공격자에게 속합니다.
정보 기술 보안의 기초는이 세 가지 기본 원칙을 기반으로합니다. 진정으로 안전한 유일한 컴퓨터는 금고, 패러데이 케이지 내부, 스틸 케이지 내부에 잠겨있는 컴퓨터입니다. 대부분의 서비스 수명을이 상태로 보내는 컴퓨터가 있습니다. 일 년에 한 번 (또는 그 이하), 그들은 신뢰할 수있는 루트 인증 기관을위한 개인 키를 생성합니다.
이제 대부분의 컴퓨터는 이러한 유형의 환경에서 사용되지 않습니다. 그들은 물리적으로 개방되어 있으며 무선 라디오 채널을 통해 인터넷에 연결되어 있습니다. 요컨대, 소프트웨어와 마찬가지로 취약합니다. 그러므로 그들은 신뢰할 수 없습니다. 컴퓨터와 소프트웨어가 유용하기 위해서는 반드시 알아야하거나해야 할 일이 있지만, 그 컴퓨터가 손상을 일으킬 수있는 정도를 알 수 없거나 충분히 할 수 없도록주의를 기울여야합니다 (적어도 해당 단일 시스템의 경계를 벗어나는 영구적 인 손상은 아님) ).
당신은 이미이 모든 것을 알고있었습니다. 그렇기 때문에 애플리케이션 코드를 보호하려고합니다. 그러나 그 안에 첫 번째 문제가있다. 난독 화 도구를 사용하면 코드를 엉망으로 만들 수 있지만 프로그램을 계속 실행해야합니다. 즉, 앱의 실제 논리 흐름과 앱이 사용하는 데이터는 난독 화의 영향을받지 않습니다. 약간의 끈기가 주어지면 공격자는 단순히 코드를 난독 화 할 수 있으며, 그가보고있는 것이 다른 것이 될 수없는 특정 경우에는 필요하지 않습니다.
대신, 공격자가 코드를 분명하게 확보하는 것이 얼마나 쉬운 지에 상관없이 공격자가 코드로 아무 것도 할 수 없도록해야합니다. 즉, 코드가 개발 한 건물을 떠나는 즉시 그 비밀은 비밀이 아니기 때문에 하드 코딩 된 비밀은 없습니다.
하드 코드 한 이러한 키-값은 응용 프로그램의 소스 코드에서 완전히 제거해야합니다. 대신, 그들은 세 곳 중 하나에 있어야합니다. 공격자가 오프라인 복사본을 얻는 것이 어렵지만 여전히 불가능하지는 않지만 장치의 휘발성 메모리. 아이언 주먹으로 액세스를 제어하는 서버 클러스터에서 영구적으로; 또는 실제 카드 또는 사용자의 메모리와 같은 장치 또는 서버와 관련이없는 두 번째 데이터 저장소에 있습니다 (즉, 휘발성 메모리에 있지만 오래 걸리지 않아도 됨).
다음 구성표를 고려하십시오. 사용자는 메모리에서 장치로 앱의 자격 증명을 입력합니다. 안타깝게도 키로거나 트로이 목마에 의해 사용자의 장치가 손상되지 않았 음을 신뢰해야합니다. 이와 관련하여 할 수있는 최선의 방법은 사용자가 사용한 장치 (MAC / IP, IMEI 등)에 대한 위조하기 어려운 식별 정보를 기억하고 최소한 하나 이상의 추가 채널을 제공함으로써 다단계 보안을 구현하는 것입니다. 익숙하지 않은 장치의 로그인 시도를 확인할 수 있습니다.
자격 증명은 일단 입력되면 클라이언트 소프트웨어 (보안 해시 사용)에 의해 난독 처리되고 일반 텍스트 자격 증명은 삭제됩니다. 그들은 그들의 목적을 달성했습니다. 난독 화 된 자격 증명은 보안 채널을 통해 인증서 인증 서버로 전송되며,이 자격 증명은 다시 해시 하여 로그인의 유효성을 확인하는 데 사용되는 데이터를 생성합니다. 이런 식으로 클라이언트는 데이터베이스 값과 실제로 비교되는 것을 절대 알 수 없으며, 앱 서버는 유효성 검사를 위해 수신 한 내용의 평문 자격 증명을 알 수 없으며, 데이터 서버는 유효성 검사를 위해 저장 한 데이터가 생성되는 방식을 알지 못합니다. 보안 채널이 손상 되더라도 중간에는 횡설수설 만 보입니다.
확인되면 서버는 채널을 통해 토큰을 다시 전송합니다. 토큰은 보안 세션 내에서만 유용하며 임의 노이즈 또는 세션 식별자의 암호화 된 (따라서 확인할 수있는) 사본으로 구성되며 클라이언트 애플리케이션은 요청의 일부로 동일한 채널에서 서버로이 토큰을 보내야합니다. 무언가를하기 위해. 클라이언트 응용 프로그램은 돈, 민감한 데이터 또는 자체적으로 손상 될 수있는 다른 작업을 수행 할 수 없기 때문에이 작업을 여러 번 수행합니다. 대신 서버에이 작업을 수행하도록 요청해야합니다. 클라이언트 응용 프로그램은 최소한 일반 텍스트가 아닌 장치 자체의 영구 메모리에 중요한 정보를 쓰지 않습니다. 클라이언트는 서버가 기억할 로컬 데이터를 암호화하기 위해 보안 채널을 통해 서버에 대칭 키를 요청할 수 있습니다. 이후 세션에서 클라이언트는 휘발성 메모리에서 사용하기 위해 데이터를 해독하기 위해 서버에 동일한 키를 요청할 수 있습니다. 이 데이터 만이 유일한 사본은 아닙니다. 클라이언트가 저장하는 것은 서버에 어떤 형태로도 전송되어야합니다.
분명히 이것은 응용 프로그램이 인터넷 액세스에 크게 의존하게 만듭니다. 클라이언트 장치는 서버에 대한 적절한 연결 및 인증 없이는 기본 기능을 수행 할 수 없습니다. 페이스 북과 다르지 않습니다.
이제 공격자가 원하는 컴퓨터는 서버입니다. 클라이언트 응용 프로그램 / 장치가 아니라 서버가 돈을 벌거나 다른 사람들이 자신의 즐거움을 위해 고통을 줄 수 있기 때문입니다. 괜찮아; 모든 클라이언트를 보호하는 것보다 서버를 보호하는 데 드는 비용과 노력에 훨씬 더 많은 돈을 지불합니다. 서버는 모든 종류의 방화벽 및 기타 전자 보안을 지원할 수 있으며 강철, 콘크리트, 키 카드 / 핀 액세스 및 24 시간 비디오 감시를 통해 물리적으로 보호 할 수 있습니다. 공격자는 실제로 서버에 직접 액세스하려면 매우 정교해야하며 서버에 대해 즉시 알아야합니다.
공격자가 할 수있는 최선의 방법은 사용자의 전화 및 자격 증명을 훔치고 클라이언트의 제한된 권한으로 서버에 로그인하는 것입니다. 신용 카드 분실과 마찬가지로 이러한 경우에는 합법적 인 사용자에게 800 번호로 전화를 걸도록 지시해야합니다. 액세스 할 수있는 모든 휴대 전화에서 고객 서비스에 직접 연결하는 휴대 전화에서 도난당했습니다. 그들은 전화기를 도난 당했다고 말하고, 기본 고유 식별자를 제공하고, 계정이 잠겨 있으며, 공격자가 처리 할 수 있었던 모든 트랜잭션이 롤백되고 공격자는 다시 정사각형으로 돌아갑니다.