iOS UIPasteboard

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

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의 접근 방식에서 영감을 받은 간단한 JavaScript 스크립트 예제로, 붙여넣기 보드의 변경 사항을 5초마다 읽고 기록합니다:

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);

References

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기

Last updated