tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
iOS 기기에서 애플리케이션 간 데이터 공유는 UIPasteboard
메커니즘에 의해 촉진되며, 이는 두 가지 주요 범주로 나뉩니다:
- 시스템 전반의 일반 클립보드: 이는 모든 애플리케이션과 데이터를 공유하는 데 사용되며, iOS 10부터 제공된 기능으로, 장치 재시작 및 앱 삭제 후에도 데이터를 지속적으로 유지하도록 설계되었습니다.
- 사용자 정의 / 명명된 클립보드: 이는 앱 내 또는 동일한 팀 ID를 공유하는 다른 앱과의 데이터 공유를 위해 특별히 설계되었으며, 이를 생성하는 애플리케이션 프로세스의 생명 주기를 넘어 지속되도록 설계되지 않았습니다. 이는 iOS 10에서 도입된 변경 사항을 따릅니다.
보안 고려사항은 클립보드를 사용할 때 중요한 역할을 합니다. 예를 들어:
- 사용자가 클립보드에 접근할 수 있는 앱 권한을 관리할 수 있는 메커니즘이 없습니다.
- 클립보드에 대한 무단 배경 모니터링의 위험을 완화하기 위해, 접근은 애플리케이션이 전경에 있을 때로 제한됩니다(이것은 iOS 9부터 적용됨).
- 개인 정보 보호 문제로 인해 지속적인 명명된 클립보드의 사용은 공유 컨테이너를 선호합니다.
- iOS 10에서 도입된 유니버설 클립보드 기능은 일반 클립보드를 통해 장치 간 콘텐츠를 공유할 수 있게 하며, 개발자가 데이터 만료를 설정하고 자동 콘텐츠 전송을 비활성화할 수 있도록 관리할 수 있습니다.
민감한 정보가 우연히 전역 클립보드에 저장되지 않도록 하는 것이 중요합니다. 또한, 애플리케이션은 전역 클립보드 데이터를 의도하지 않은 작업에 악용되지 않도록 설계되어야 하며, 개발자는 민감한 정보를 클립보드에 복사하는 것을 방지하기 위한 조치를 구현하도록 권장됩니다.
정적 분석
정적 분석을 위해 소스 코드나 바이너리에서 다음을 검색합니다:
generalPasteboard
를 사용하여 시스템 전반의 일반 클립보드 사용을 식별합니다.pasteboardWithName:create:
및pasteboardWithUniqueName
을 사용하여 사용자 정의 클립보드를 생성합니다. 지속성이 활성화되어 있는지 확인하되, 이는 더 이상 사용되지 않습니다.
동적 분석
동적 분석은 특정 메서드를 후킹하거나 추적하는 것을 포함합니다:
- 시스템 전반의 사용을 위해
generalPasteboard
를 모니터링합니다. - 사용자 정의 구현을 위해
pasteboardWithName:create:
및pasteboardWithUniqueName
을 추적합니다. - 지속성 설정을 확인하기 위해 더 이상 사용되지 않는
setPersistent:
메서드 호출을 관찰합니다.
모니터링해야 할 주요 세부 사항은 다음과 같습니다:
- 클립보드 이름 및 내용(예: 문자열, URL, 이미지 확인).
- 존재하는 항목 수 및 데이터 유형, 표준 및 사용자 정의 데이터 유형 검사를 활용합니다.
setItems:options:
메서드를 검사하여 만료 및 로컬 전용 옵션을 확인합니다.
모니터링 도구 사용의 예로는 objection의 클립보드 모니터가 있으며, 이는 일반 클립보드를 5초마다 폴링하여 변경 사항을 확인하고 새로운 데이터를 출력합니다.
다음은 objection의 접근 방식에서 영감을 받아 클립보드의 변경 사항을 5초마다 읽고 기록하는 간단한 JavaScript 스크립트 예제입니다:
const UIPasteboard = ObjC.classes.UIPasteboard
const Pasteboard = UIPasteboard.generalPasteboard()
var items = ""
var count = Pasteboard.changeCount().toString()
setInterval(function () {
const currentCount = Pasteboard.changeCount().toString()
const currentItems = Pasteboard.items().toString()
if (currentCount === count) {
return
}
items = currentItems
count = currentCount
console.log(
"[* Pasteboard changed] count: " +
count +
" hasStrings: " +
Pasteboard.hasStrings().toString() +
" hasURLs: " +
Pasteboard.hasURLs().toString() +
" hasImages: " +
Pasteboard.hasImages().toString()
)
console.log(items)
}, 1000 * 5)
참고문헌
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8
- https://hackmd.io/@robihamanto/owasp-robi
- https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.