
TrustZone 지원 ARMv8 코어의 보안 월드에 있는 소프트웨어를 대상으로 트레이스 기반 캐시 공격을 수행하고 시각화하도록 설계된 도구
Cachegrab은 TrustZone 지원 ARMv8 코어의 보안 월드에서 소프트웨어에 대한 트레이스 기반 캐시 공격을 수행하고 시각화하는 데 도움을 주도록 설계된 도구입니다. Cachegrab이 내부적으로 어떻게 작동하는지에 대한 개요는 Cachegrab 릴리스 발표를 참조하십시오.
Android 기기에서 Cachegrab을 사용할 수 있습니다. 최신 버전의 Android에서는 커널 모듈을 허용하지 않으므로 CONFIG_MODULES 및 CONFIG_MODULE_UNLOAD 커널 옵션을 활성화하고 커널을 다시 빌드한 후 기기에 플래시해야 합니다. 커널 소스를 기준으로 Cachegrab 커널 모듈을 빌드하고 insmod를 사용하여 대상 기기의 실행 중인 커널에 삽입하십시오.
다음으로 Cachegrab 서버와 shim 라이브러리를 빌드하고 둘 다 /data/local/tmp에 복사하십시오. 서버를 시작합니다. 마지막으로 adb forward tcp:8000 tcp:8000을 사용하여 로컬 TCP 포트 8000을 기기의 포트에 바인딩합니다.
경고: 서버는 공격자가 피해자 코드를 호출하기 위해 임의의 셸 명령을 지정할 수 있게 합니다. 이러한 명령은 HTTP를 통해 지정되며 루트 권한으로 실행되므로 Cachegrab을 실행 중인 테스트 기기가 신뢰할 수 있는 네트워크에 있는 것이 중요합니다.
마지막으로 Cachegrab GUI를 로드하고 localhost:8000에 연결합니다.
Cachegrab 클라이언트는 공격 데이터가 포함된 샘플을 처리하는 파이프라인(pipeline)이라는 개념을 중심으로 구성됩니다. 파이프라인은 샘플 소스(sample source), 필터 목록, 분석기(analyzer)로 구성됩니다. 샘플 소스는 파일 시스템의 위치, Cachegrab 서버를 실행 중인 기기, 또는 사용자 지정 항목일 수 있습니다. 파이프라인은 소스에서 샘플을 수집하고 각 샘플을 파이프라인의 필터를 통과시켜 샘플의 데이터를 수정할 수 있게 합니다. 마지막으로 필터링된 샘플은 분석기로 전달되어 공격 데이터의 최종 처리를 수행합니다.
클라이언트의 대부분은 GUI를 사용하여 상호 작용할 수 있으며, GUI는 유용한 파이프라인 한 쌍을 관리하는 간단한 방법을 제공합니다. 첫 번째 파이프라인은 "Scope" 패널에 구성된 Cachegrab 서버에서 샘플을 수집합니다. 이 파이프라인은 샘플을 일련의 필터를 통과시킨 후 결과로 생성된 필터링된 샘플을 데이터셋(dataset)에 저장합니다. 데이터셋은 GUI를 사용하여 가져오거나 내보낼 수 있으므로 샘플 데이터를 쉽게 전송할 수 있습니다. 두 번째 파이프라인은 데이터셋에서 샘플을 가져와 다른 일련의 필터를 통해 샘플을 실행하고 필터링된 트레이스를 창에 플로팅합니다.

cachegrab 클라이언트 Python 모듈을 직접 사용하여 수집 또는 분석 스크립트를 만들 수도 있습니다. 다음 스크립트는 GUI에서 내보낸 데이터셋을 가져와 각 샘플의 트레이스에 대해 일부 처리를 수행하고 결과 데이터를 출력합니다.
from cachegrab import Pipeline
from cachegrab.data import Dataset, Trace
from cachegrab.sources import DatasetSource
from cachegrab.filters import Filter
from cachegrab.sinks import AnalysisSink
class SampleFilter(Filter):
def filter(self, sample):
for t in sample.get_trace_names():
data = sample.get_trace(t).data
sample.set_trace(t, Trace(data - data.mean()))
return sample
class SampleAnalysis(AnalysisSink):
def analyze_once(self, sample):
for t in sample.get_trace_names():
print sample.get_trace(t).data
dataset = Dataset().load("exported_dataset_location")
pipeline = Pipeline(DatasetSource(dataset), SampleAnalysis())
pipeline.add_filter(SampleFilter())
pipeline.run()