You are on page 1of 48

Cas Cremers

Scyther
User Manual

Draft February 18, 2014


2
Contents
1 Giới thiệu 5

2 Nền 7

3 Cài đặt 9

4 Hướng dẫn bắt đầu nhanh 11

5 Ngôn ngữ nhập 15

5.1 Một tập tin đầu vào tối thiểu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5.2 Điều khoản. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5.2.1 Thuật ngữ nguyên tử. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5.2.2 Ghép ..................................... 16

5.2.3 Phím đối xứng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

5.2.4 Phím không đối xứng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2.5 Hàm băm. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2.6 Các loại xác định trước. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2.7 Loại usertypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.3 Sự kiện. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5.3.1 Nhận và gửi sự kiện . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5.3.2 Yêu cầu sự kiện và tính bảo mật. . . . . . . . . . . . . . . . . . . . . 18

5.3.3 Tính toán nội bộ/các sự kiện khớp mẫu. . . . . . . . . . . . . . . . . 19

5.4 Định nghĩa vai trò. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5.5 Định nghĩa giao thức. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5.6 Khai báo toàn cầu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5.7 Miscellaneous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5.7.1 Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5.7.2 Include ..................................... 22

5.7.3 one-role-per-agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5.8 Ngôn ngữ BNF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5.8.1 Nhập tệp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5.8.2 Giao thức. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

5.8.3 Vai trò ...................................... 23

5.8.4 Sự kiện. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

5.8.5 Tờ khai. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.8.6 Thuật Ngữ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4 CONTENTS
6 Mô hình hóa giao thức bảo mật 25

6.1 Giới thiệu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6.2 Ví dụ: Needham-Schroeder khoá công cộng. . . . . . . . . . . . . . . . . . . . . . 25

7 Xác định các tính bảo mật 29

7.1 Chỉ định bí mật . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

7.2 Chỉ định các tính xác thực ......................... 29

7.2.1 Aliveness. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

7.2.2 Đồng bộ hóa không phun. . . . . . . . . . . . . . . . . . . . . . . . . 29

7.2.3 Thỏa thuận không phun. . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

7.2.4 Thỏa thuận về dữ liệu.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

8 Using the Scyther tool GUI 31

8.1 Kết quả. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

8.2 Bounding the statespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

8.3 Đồ thị tấn công. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

8.3.1 Chạy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

8.3.2 Sự kiện giao tiếp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

8.3.3 Tuyên bố. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

9 Sử dụng công cụ dòng lệnh Scyther 37

10 Chủ đề nâng cao 39

10.1 Mô hình hóa nhiều hơn một cặp chìa khóa không đối xứng. . . . . . . . . . . . . . . . . . . . 39

10.2 Xấp xỉ lý thuyết tương đương. . . . . . . . . . . . . . . . . . . . . . . . . . 39

10.3 Mô hình hóa tem thời gian và quầy toàn cầu. . . . . . . . . . . . . . . . . . . . . . 41

10.3.1 Mô hình hóa bộ đếm toàn cầu ........................... 41

10.3.2 Mô hình thời gian-tem bằng cách sử dụng nonces . . . . . . . . . . . . . . . . . . . . . 41

10.3.3 Mô hình thời gian-tem bằng cách sử dụng biến .................... 42

10.4 Tấn công đa giao thức. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

11 Đọc thêm 45

Một thông số kỹ thuật đầy đủ cho khoá công cộng Needham-Schroeder 49

Chapter 1

3
Giới thiệu
Lưu ý: đây là bản nháp của phiên bản mới của sách hướng dẫn Scyther. Do đó, sổ tay
có thể không đầy đủ tại các điểm.
Bất kỳ thông tin phản hồi được chào đón và có thể được gửi đến CAS cremers bằng e-
mail:cas.cremers@cs.ox.ac.uk.

T là hướng dẫn sử dụng cho công cụ xác minh giao thức bảo mật Scyther.
Mục đích của sổ tay hướng dẫn này là để giải thích các chi tiết của ngôn ngữ nhập Scyther, giải
thích cách mô hình các giao thức cơ bản, và cách sử dụng hiệu quả công cụ Scyther. Sổ tay hướng dẫn
này không chi tiết mô hình thực hiện giao thức cũng như mô hình kẻ thù được sử dụng bởi công cụ. Do
đó, rất khuyên bạn nên đọc sách đi kèm [1]. Cuốn sách bao gồm một mô tả chi tiết về mô hình giao thức
cơ bản của Scyther, thông số kỹ thuật tài sản bảo mật và thuật toán.
Chúng tôi tiến hành theo cách sau. Một số nền được đưa ra trong chương 2. Chương 3 giải thích
cách cài đặt công cụ Scyther trên các nền tảng khác nhau. Trong chương 4 chúng tôi đưa ra một hướng
dẫn ngắn gọn bằng cách sử dụng các ví dụ đơn giản để hiển thị những điều cơ bản của công cụ. Sau đó,
chúng tôi thảo luận chi tiết hơn khi chúng tôi giới thiệu ngôn ngữ nhập của công cụ trong chương 5. Mô
hình hóa các giao thức cơ bản được miêu tả trong chương 6 và chương 7 mô tả cách xác định các thuộc
tính bảo mật. Việc sử dụng phiên bản GUI của công cụ sau đó được giải thích chi tiết hơn trong phần 8.
Công cụ dòng lệnh cơ bản được mô tả trong phần 9. Các chủ đề nâng cao được thảo luận trong mục 10.

Online information
Trợ giúp thêm có thể được tìm thấy trực tuyến trên Scyther website:
http://users.ox.ac.uk/~coml0529/scyther/index.html
Người dùng nên đăng ký vào danh sách gửi thư Scyther, mà chi tiết cũng có thể được tìm thấy trên trang
web của Scyther.
6 CHAPTER 1. INTRODUCTION
Chapter 2

Nền
Scyther là một công cụ cho các phân tích chính thức của các giao thức an ninh theo giả định mật mã
hoàn hảo, trong đó người ta cho rằng tất cả các chức năng mật mã là hoàn hảo: kẻ thù không học được
gì từ một tin nhắn được mã hóa trừ khi ông biết chìa khóa giải mã . Công cụ này có thể được sử dụng để
tìm các vấn đề phát sinh từ cách giao thức được xây dựng. Vấn đề này là undecidable nói chung, nhưng
trong thực tế, nhiều giao thức có thể được chứng minh là chính xác hoặc tấn công có thể được tìm thấy.
Mô hình giao thức đầy đủ, các giả định của nó, thuộc tính bảo mật cơ bản và thuật toán được mô tả
trong [1]. Sổ tay hướng dẫn này phục vụ như một người bạn đồng hành với cuốn sách. Vì vậy, trong sổ
tay này, chúng tôi giả sử người đọc là quen thuộc với các mô hình chính thức của các giao thức bảo mật
và tài sản của họ.

5
8 CHAPTER 2. BACKGROUND
Chapter 3

Cài đặt
Scyther có thể được tải về từ trang web sau đây: http://users.ox.ac.uk/~coml0529/scyther/
Hướng dẫn cài đặt được bao gồm trong các tài liệu lưu trữ có thể tải xuống Scyther. Scyther có sẵn cho
các nền tảng Windows, Linux và Mac OS.

7
10 CHAPTER 3. INSTALLATION
Chapter 4

Hướng dẫn bắt đầu nhanh


Scyther mất như đầu vào một mô tả giao thức bảo mật bao gồm một đặc điểm kỹ thuật của các thuộc
tính bảo mật, được gọi là yêu cầu bảo mật, và thẩm định này.
Bắt đầu Scyther bằng việc thực hiện các chương trình scyther-gui.py trong thư mục Scyther.
Chương trình sẽ khởi động hai cửa sổ: cửa sổ chính, trong đó các tệp được sửa, và cửa sổ về, Hiển thị
một số thông tin về công cụ.
Như một ví dụ giới thiệu, chúng tôi sẽ xác minh giao thức Needham-Schroeder, và điều tra một cuộc
tấn công vào nó.
Đi đến tập tin → mở hộp thoại, và mở tập tin ns3. spdl trong thư mục Scyther. Cửa sổ chính của bạn
nên trông giống như một trong hình 4.
Theo quy ước, các tệp mô tả giao thức có phần mở rộng. spdl (ngôn ngữ mô tả giao thức bảo mật),
nhưng nó có thể có bất kỳ tên nào. Tệp được sử dụng trong ví dụ này được hiển thị trong phụ lục A.
Chạy công cụ xác minh bằng cách chọn xác minh → xác minh/khiếu nại trong menu. Một cửa sổ
mới sẽ xuất hiện trong quá trình xác minh. Sau khi xác minh hoàn tất, cửa sổ sẽ được thay thế bằng cửa
sổ kết quả, như trong hình 4.
Cửa sổ kết quả hiển thị tóm tắt các yêu cầu trong giao thức và kết quả xác minh. Ở đây người ta có
thể tìm thấy giao thức là chính xác, hoặc sai. Trong phần tiếp theo sẽ có một giải thích đầy đủ về những
kết quả có thể có của quá trình xác minh. Quan trọng nhất, nếu một yêu cầu bồi thường giao thức không
chính xác, sau đó có tồn tại ít nhất một cuộc tấn công vào giao thức. Một nút được hiển thị bên cạnh yêu
cầu bồi thường: nhấn nút này để xem các cuộc tấn công trên yêu cầu bồi thường, như trong hình 4.

9
10

CHAPTER 4. QUICK START TUTORIAL

Figure 4.1: Cửa sổ chính scyther với các tập tin ns3. spdl đang mở
13
Figure 4.2: Cửa sổ kết quả scyther
CHAPTER 4. QUICK START TUTORIAL
12

Figure 4.3: Scyther attack window

Chapter 5
Ngôn ngữ nhập
Ngôn ngữ nhập của scyther dựa trên một cú pháp giống C/Java. Mục đích chính của ngôn ngữ là để mô tả các
giao thức, được xác định bởi một tập hợp các vai trò. Vai trò, lần lượt, được xác định bởi một chuỗi các sự kiện,
hầu hết trong số đó là các sự kiện biểu thị việc gửi hoặc nhận các điều khoản.
Chúng tôi mô tả các yếu tố này trong các phần sau.
Ý kiến có thể bắt đầu với//hoặc # (đối với một dòng ý kiến) hoặc được kèm theo/* và */(đối với nhiều dòng ý
kiến). Lưu ý rằng nhận xét nhiều dòng không thể được lồng nhau.
Bất kỳ khoảng trắng giữa các yếu tố được bỏ qua. Do đó, có thể sử dụng khoảng trắng (không gian, tab, dòng
mới) để cải thiện khả năng đọc.
Một nhận dạng cơ bản bao gồm một chuỗi các ký tự từ tập hợp các ký tự chữ và số cũng như các ký hiệu ^
và -.
Ngôn ngữ là trường hợp nhạy cảm, do đó NS3 không phải là định danh tương tự như NS3.

5.1 Một tập tin đầu vào tối thiểu


Các yếu tố cốt lõi trong một tập tin đầu vào Scyther là định nghĩa giao thức. Một ví dụ tối thiểu là sau:
Example:
Protocol(I,R)
{
role I { };
role R { };
};

Ở trên, chúng tôi đã xác định một giao thức gọi là "ExampleProtocol" có hai vai trò, "I" và "R" bằng cách liệt kê
chúng giữa các dấu ngoặc sau tên giao thức. Lưu ý rằng chúng tôi đã không xác định hành vi của các vai trò
này: được định nghĩa trong dấu ngoặc nhọn sau vai trò tương ứng I và vai trò R lệnh.

5.2 ThuẬT Ngữ


Ở cấp độ cơ bản nhất, Scyther thao túng các thuật ngữ.

5.2.1 Thuật ngữ nguyên tử


Một thuật ngữ nguyên tử có thể là bất kỳ định danh nào, thường là một chuỗi các ký tự chữ và số.

15
14 CHAPTER 5. INPUT LANGUAGE
Các thuật ngữ nguyên tử có thể được kết hợp thành các thuật ngữ phức tạp hơn bởi các nhà khai thác
như ghép nối và mã hóa.

Hằng
Giá trị mới được tạo ra
Nhiều giao thức bảo mật dựa vào tạo ra các giá trị ngẫu nhiên. Chúng có thể được xác định bằng cách
tuyên bố chúng bên trong một định nghĩa vai trò sử dụng tờ khai tươi. Ví dụ: để tạo một giá trị ngẫu
nhiên na loại nonce, chúng tôi chỉ định:
role X(...) {
fresh Na: Nonce;

send_1(X,Y,Na);
}

Biến
Người thực hiện có thể sử dụng biến để lưu trữ các điều khoản nhận được. Ví dụ, để nhận một nonce
vào một biến với tên na, chúng tôi chỉ định:
role Y(...) {
var Na: Nonce;

recv_1(X,Y,Na);
}

Khai báo địa phương, cho cả hai giá trị mới được tạo ra cũng như các biến như na, là địa phương để vai
trò. Do đó, người ta có thể chỉ định một nonce mới được tạo ra trong một vai trò và một biến na trong
vai trò khác mà không có bất kỳ xung đột. Biến là cứng nhắc: sau khi nhận được sự kiện đầu tiên mà
chúng xảy ra đã được thực hiện, chúng được gán một giá trị. Giá trị này không thể thay đổi sau đó.
Các biến phải xảy ra đầu tiên trong sự kiện nhận: nó không được phép sử dụng các biến
Uninitialized trong sự kiện gửi.

5.2.2 Ghép
Bất kỳ hai điều khoản có thể kết hợp thành một cặp hạn: chúng tôi viết (x, y) cho các cặp x và y. Nó
cũng được phép viết n-tuples as (x, y, z), được giải thích bởi Scyther as ((x, y), z).

5.2.3 Phím đối xứng


Bất kỳ thuật ngữ có thể hoạt động như một chìa khóa cho mã hóa đối xứng. Mã hóa của ni với một
Kir hạn được viết là:
{ ni }kir

Trừ khi Kir được xác định rõ ràng là một phần của cặp chìa khóa không đối xứng (giải thích bên
dưới), điều này được hiểu là mã hóa đối xứng.
Một hạ tầng khóa đối xứng được xác định trước: k (X, Y) chỉ ra khóa đối xứng dài hạn dùng chung
giữa X và Y.
15
5,2. Thuật ngữ

5.2.4 Phím không đối xứng


Một cơ sở hạ tầng khóa công khai (PKI) được xác định trước: SK (X) biểu thị khóa cá nhân dài hạn của
X, và PK (X) chỉ ra chìa khóa công cộng tương ứng.
Ví dụ, hãy xem xét các thuật ngữ sau. Nó đại diện cho việc mã hóa của một số thuật ngữ bởi PK hạn
(I). Trong các quy ước bình thường, điều này có nghĩa là nonce của khởi đầu (ni) được mã hóa với chìa
khóa công cộng của người khởi xướng.

{ ni }pk(I)

Thuật ngữ này chỉ có thể được giải mã bởi một đại lý biết khóa bí mật SK (I). Phần 10,1 Mô
tả làm thế nào để mô hình nhiều hơn một cặp quan trọng cho mỗi người thực hiện.

5.2.5 Hàm băm


Hàm băm là về cơ bản mã hóa với một chức năng, trong đó nghịch đảo không được biết đến bởi bất cứ
ai.
Họ có thể được sử dụng bởi một tuyên bố toàn cầu của một nhận dạng là một hashfunction, ví dụ
như:
hashfunction H1;

Như tất cả các đại lý và giao thức nên có quyền truy cập vào một chức năng như vậy, tuyên bố của
hashfunction thường là toàn cầu, nghĩa là, được xác định bên ngoài của bất kỳ định nghĩa giao thức.
Sau khi tuyên bố, chúng có thể được sử dụng trong các thông điệp giao thức, ví.:
H1(ni)

5.2.6Predefined types
Loại ủy nhiệm cho người thực hiện.

Chức năng một loại đặc biệt xác định một thuật ngữ chức năng có thể mất một danh sách các thuật ngữ
dưới dạng tham số. Theo mặc định, nó hoạt động như một hàm băm: cho thuật ngữ h (x), trong đó h là
kiểu chức năng, không thể lấy được x.

Nonce một loại tiêu chuẩn mà thường được sử dụng và do đó xác định bên trong công cụ.

Vé một biến loại vé có thể được thay thế bằng bất kỳ hạn.

5.2.7 Loại usertypes


Có thể xác định một loại mới. Điều này có thể được thực hiện bằng cách sử dụng lệnh usertype:
16 CHAPTER 5. INPUT LANGUAGE
usertype MyAtomicMessage;

protocol X(I,R) { role I {


var y: MyAtomicMessage; recv_1(I,R, y );

Hiệu quả của một tuyên bố như vậy là các biến của loại mới chỉ có thể được instantiated với tin nhắn m
của loại đó, nghĩa là, đã được tuyên bố bởi các tuyên bố toàn cầu const m:
MyAtomicMessage hoặc tươi mới được tạo ra m: MyAtomicMessage trong một vai trò.
Nói chung, công cụ này có thể hoạt động tốt hơn nếu biết thêm thông điệp nào có thể thống nhất hay
không. Bằng cách xác định usertype, modeler có thể thông báo cho công cụ rằng một biến chỉ có thể
được instantiated với các điều khoản của loại đó, và không phải với, ví dụ như, điều khoản của loại
nonce. Khái niệm, người ta luôn có thể viết vé (tương ứng với tất cả các tin nhắn có thể) cho mỗi loại
biến, nhưng sau đó một có thể tìm thấy các cuộc tấn công sai (trong trường hợp thực hiện trong thực tế,
kiểm tra các loại của một tin nhắn) và các công cụ sẽ ít có khả năng xác minh tài sản (cho một số không
bị chặn của chạy).

5.3 Sự kiện
5.3.1 Nhận và gửi sự kiện
Các recv và gửi sự kiện đánh dấu nhận và gửi một tin nhắn, tương ứng.
Lưu ý rằng trong một số tập tin mô tả giao thức người ta có thể tìm thấy từ khóa đọc: đây là cú pháp
lỗi thời và một cách an toàn có thể được thay thế bằng recv.
Trong hầu hết các trường hợp, mỗi sự kiện gửi sẽ có sự kiện recv tương ứng. Chúng tôi chỉ định thư
từ này bằng cách cho các sự kiện như vậy cùng nhãn, được ký hiệu bởi một.
Đối với một số giao thức, chúng tôi có thể muốn mô hình gửi hoặc nhận cho kẻ thù trực tiếp, trong
trường hợp này chúng tôi không có sự kiện tương ứng. Nếu một sự kiện gửi hoặc recv không có sự kiện
tương ứng, Scyther sẽ xuất ra một cảnh báo. Để nhấn lên cảnh báo này, nhãn có thể được tiền tố bởi một
bang!, ví dụ như.:
send_!1(I,I, LeakToAdversary );

5.3.2 Yêu cầu sự kiện và tính bảo mật


Yêu cầu sự kiện được sử dụng trong vai trò thông số kỹ thuật để mô hình thuộc tính bảo mật. Ví dụ, các
mô hình sự kiện yêu cầu bồi thường sau mà ni có nghĩa là.
claim(I, Secret, Ni);

Có một số loại yêu cầu xác định trước.

Bí mật tuyên bố này yêu cầu một thuật ngữ tham số. Bí mật của thuật ngữ này là tuyên bố như được
định nghĩa trong [1].

SKR điều kiện xác minh cho tuyên bố này tương đương với yêu cầu bồi thường bí mật.
17
Mục đích của tuyên bố này là để thêm đánh dấu thuật ngữ tham số như là một khóa phiên. Hậu
quả là việc sử dụng khóa phiên tiết lộ quy tắc kẻ thù bây giờ sẽ tiết lộ thuật ngữ tham số.
Nếu quy tắc Hiển thị khóa phiên không được bật, tuyên bố này giống với yêu cầu bí mật.

Sự sống aliveness (của tất cả các vai trò) như được định nghĩa trong [4].

Thỏa thuận yếu kém đồng ý (của tất cả các vai trò) như được định nghĩa trong [4].
5.3. EVENTS

Cam kết, chạy các thỏa thuận không bị tổn thương với một vai trò trên một tập hợp các mục dữ liệu [4]
có thể được xác định bằng cách chèn các tuyên bố tín hiệu thích hợp. Trong bối cảnh này, cam kết
đánh dấu yêu cầu có hiệu quả, tính đúng đắn đòi hỏi sự tồn tại của một tín hiệu chạy tương ứng
trong dấu vết.
Những tuyên bố này được sử dụng để mô hình thỏa thuận về dữ liệu, được giải thích trong phần
7.2.4.

Nisynch không phun đồng bộ như được định nghĩa trong [1].

Niagree thỏa thuận không phun về tin nhắn như được định nghĩa trong [1].

Truy cập khi tuyên bố này được xác minh, Scyther sẽ kiểm tra xem tuyên bố này có thể đạt được ở tất
cả.

Đó là sự thật IFF có tồn tại một dấu vết mà trong đó yêu cầu bồi thường này xảy ra. Điều này có thể hữu
ích để kiểm tra xem không có lỗi rõ ràng trong các đặc điểm kỹ thuật giao thức, và trong thực tế
được chèn vào khi--kiểm tra chế độ của Scyther được sử dụng.

Làm rỗng tuyên bố này sẽ không được xác minh, nhưng chỉ đơn giản là bỏ qua. Nó chỉ hữu ích khi
Scyther được sử dụng như một back-end cho các phương tiện xác minh khác. Để biết thêm về
điều này, xem phần 10.

5.3.3 Tính toán nội bộ/các sự kiện khớp mẫu


Chúng tôi mở rộng bộ các sự kiện cơ bản từ [1] với hai sự kiện có thể được sử dụng để mô hình tính
toán nội bộ.

Sự kiện trận đấu New in version v1.1 and Compromise-0.8

Sự kiện mới đầu tiên là sự kiện đối sánh, được sử dụng để chỉ định kết hợp mẫu, tức là.,
match(pt,m)

Trong điều kiện hoạt động, nếu có tồn tại một thay thế tốt gõ σ như σpt = m, sau đó sự kiện này có thể
được thực hiện. Sau khi thực hiện, thay thế được áp dụng cho các sự kiện còn lại của vai trò.
Sự kiện này có thể được sử dụng để mô hình các cấu trúc khác nhau, chẳng hạn như kiểm tra bình
đẳng, giải mã chậm, kiểm tra cam kết. Họ cũng có thể được sử dụng để mô hình tính toán nội bộ để đơn
giản hóa các chi tiết kỹ thuật, ví dụ.:
18 CHAPTER 5. INPUT LANGUAGE
var X: Nonce; var
Y;

recv(R,I, X); match(Y,


hash(X,I,R) ); send(I,R, Y,{ Y }
sk(I) );
Trong ví dụ trên, chúng ta có thể thay thế Y bởi Hash (X, I, R) trong suốt các đặc điểm kỹ thuật, nhưng
phiên bản này tránh sao chép.

Not match event New in version v1.1 and Compromise-0.8

Sự kiện mới thứ hai là sự kiện không phù hợp, được sử dụng để chỉ định kết hợp mẫu, tức là.,
not match(pt,m)
Việc giải thích hoạt động là đối diện của sự kiện trước đó. Nếu không có thay thế σ như vậy mà σpt =
m, sau đó sự kiện có thể được thực hiện.
Sự kiện này có thể được sử dụng để mô hình, ví dụ như, bất bình đẳng hạn chế. Ví dụ: mô hình thực
hiện cho phép các tác nhân mặc định xử lý phiên với chính họ. Trong một số trường hợp, chúng tôi
muốn loại trừ các hành vi như vậy, vì giao thức không cho phép nó. Ví dụ:,
role A {
not match(A,B); send (A,B, m1);
}

Mô hình một vai trò mà các phiên bản chỉ gửi tin nhắn cho các đại lý khác.
Như một cách sử dụng cao cấp hơn, phù hợp và không phù hợp có thể được sử dụng với nhau trong
hai vai trò với một chuỗi bắt đầu phổ biến các sự kiện để mô hình nếu... Sau đó... cấu trúc khác.

5.4 Định nghĩa vai trò


Định nghĩa vai trò là chuỗi sự kiện, ví dụ như tờ khai, gửi, nhận hoặc yêu cầu sự kiện.
role Server {
var x,y,z: Nonce;

fresh n,m: Nonce;

send_1(Server,Init, m,n ); recv_2(Init,Server, x,y, { z }


pk(Server) );
}
5.5 Định nghĩa giao thức
Một định nghĩa giao thức mất như một tham số một chuỗi các vai trò, sau đó được xác định trong cơ thể
của nó.
19
protocol MyProt(Init,Resp,Server)
{ role Init { ...
} role Resp
{ ...
} role Server
{ ...
}
}

Giao thức trợ giúp


Có thể thêm một "@" biểu tượng trước khi một tên giao thức. Điều này không ảnh hưởng đến mô hình
giao thức, cũng như kết quả của phân tích. Các "@" chỉ được sử dụng khi rendering đồ thị đầu ra: mục
đích là để đánh dấu các giao thức như là một "trợ giúp giao thức". Các giao thức này thường được sử
dụng để mô hình
5.6. KHAI BÁO TOÀN CẦU

Thêm các khả năng của kẻ thù, xem phần 10 ví dụ. Khi rendering đồ thị đầu ra, Scyther sụp đổ các
phiên bản vai trò của các giao thức trợ giúp vào các nút đơn. Điều này có thể làm cho đồ thị dễ đọc hơn.

Giao thức đối xứng-vai trò


Một số quy tắc thỏa hiệp đối nghịch, chẳng hạn như SKR và Lkrafterchính xác phụ thuộc vào chức năng
đối tác. Đối với các giao thức hoàn toàn đối xứng trong vai trò của họ và tính toán chính (chẳng hạn như
HMQV), đây không phải là chức năng phù hợp đối tác. Để sử dụng đúng chức năng đối tác, giao thức
cần phải được chú thích như một giao thức vai trò đối xứng. Điều này hướng dẫn Scyther sử dụng chức
năng đối tác thích hợp.
symmetric-role protocol MyProt(Init,Resp)
{ role Init { ...
} role Resp
{ ...
}
}

5.6Global declarations
Trong nhiều ứng dụng hằng số chung được sử dụng. Chúng bao gồm, ví dụ: hằng số chuỗi, nhãn hoặc
nhận dạng giao thức.
Chúng được mô hình hóa và sử dụng theo cách sau:
20 CHAPTER 5. INPUT LANGUAGE
usertype String; const
HelloWorld: String;

protocol hello(I,R)
{
role I {
send_1(I,R, HelloWorld);
}
role R {
recv_1(I,R, HelloWorld);
}
}
5.7 Điều khoản khác
5.7.1 Macro New in version v1.1 and Compromise-0.8

Có thể xác định các macro, nghĩa là viết tắt cho các thuật ngữ cụ thể. Cú pháp dùng để định nghĩa các
chữ viết tắt này là như sau:
macro MyShortCut = LargeTerm;
Ví dụ: đối với một giao thức có chứa thư phức tạp hoặc lặp lại các yếu tố, macro có thể được sử dụng để
đơn giản hóa giao thức đặc tả:
hashfunction h;

protocol macro-example-one(I,R) { role I


{ fresh nI: Nonce; macro m1 = h(I,ni);

send_1(I,R, { m1 }pk(R) ); claim(I, Secret,


m1);
}
role R { var X:
Ticket;

recv_1(I,R, { X }pk(R) );
}
}

Lưu ý rằng macro có phạm vi toàn cầu và được xử lý ở cấp độ synchiến thuật. Điều này cũng cho phép
viết tắt toàn cầu của các thông điệp giao thức, e.g.:
21
hashfunction h; macro m1 = { I,R, nI, h(nI,R) }
pk(R);

protocol macro-example-two(I,R) { role I


{ fresh nI: Nonce;

send_1(I,R, m1 );
}
role R { var nI:
Nonce;

recv_1(I,R, m1 );
}
}

Lưu ý rằng trong ví dụ trên, nI là một nonce mới được tạo ra trong vai trò của tôi, và một biến trong vai
trò R. Bởi vì các định nghĩa mac

ro được unfolded cú pháp, Macro tương tự có thể được sử dụng để đề cập đến cả hai thuật ngữ.

5.7.2 Include
Có thể nhập các tệp khác trong đặc tả giao thức:
include "filename";

trong đó tên tập tin là biểu hiện của file sẽ được đưa vào thời điểm này. Sử dụng lệnh này, có thể
chia sẻ, ví dụ: một tập hợp các định nghĩa phổ biến giữa các tệp. Thông thường, điều này sẽ bao gồm
các định nghĩa cho các cấu trúc chính và tên đại lý (không đáng tin cậy). Lồng nhau sử dụng lệnh này có
thể.
5.7.3one-role-per-agent New in version v1.1 and Compromise-0.8
Ngữ nghĩa hoạt động cho phép các đại lý để thực hiện bất kỳ vai trò, và thậm chí nhiều vai trò khác
nhau song song. Sự lựa chọn mô hình này tương ứng với kịch bản tồi tệ nhất có thể, trong đó kẻ thù có
nhiều lựa chọn nhất để khai thác. Tuy nhiên, trong nhiều thiết lập bê tông, các đại lý chỉ thực hiện một
vai trò. Ví dụ, tập hợp các máy chủ có thể được tách ra từ các tập hợp các khách hàng, hoặc tập hợp các
thẻ RFID có thể được tách ra khỏi bộ độc giả. Trong những trường hợp như vậy, chúng ta không cần
phải xem xét các cuộc tấn công khai thác rằng một đại lý có thể thực hiện nhiều vai trò. Điều này có thể
được mô phỏng bằng lệnh sau:
option "--one-role-per-agent"; // disallow agents in multiple roles

Điều này khiến cho Scyther bỏ qua các cuộc tấn công mà các đại lý thực hiện nhiều vai trò. Phrased
khác nhau, điều này tương ứng với tình hình trong đó mỗi vai trò được thực hiện bởi một bộ chuyên
dụng của các đại lý.

5.8 Ngôn ngữ BNF


Phần ngữ pháp BNF đầy đủ cho ngôn ngữ nhập được đưa ra dưới đây. Trong định nghĩa ngôn ngữ
nghiêm ngặt, không có điều khoản yêu cầu bồi thường như Niagree và Nisynch, và không có bất kỳ lớp
22 CHAPTER 5. INPUT LANGUAGE
học loại định sẵn như đại lý. Thay vào đó, chúng là các thuật ngữ liên tục được xác định trước trong
chính công cụ Scyther.

5.8.1 Nhập tệp


Một tập tin đầu vào chỉ đơn giản là một danh sách các cấu trúc spdl, được khai báo toàn cầu hoặc mô tả
giao thức.

hspdlcompletei ::= hspdli { ’;’ hspdli } hspdl|

hiprotocol::= hglobaldeclarationi i

5.8.2 Giao thức


Một giao thức chỉ đơn giản là một container cho một tập hợp các vai trò. Bởi vì chúng tôi sử dụng một
phương pháp dựa trên vai trò để mô tả vai trò, chứa giao thức thực tế chỉ ảnh hưởng đến việc đặt tên của
các vai trò: một vai trò "tôi" trong một giao thức "ns3" nội bộ sẽ được gán tên "ns3. Tôi ". Điều này
được sử dụng để làm cho tên vai trò duy nhất trên toàn cầu. hprotocoli:: = ' Protocol ' hidi ' (' htermlisti ')
' ' {' hrolesi '} ' ['; ']

5.8.3 Roles

hroles|hdeclarationi ::= hroleii [[ hhrolesrolesii ]]

hrolei ::= [ ‘singular’ ] ‘role’ hidi ‘{’ hroledef i ‘}’ [ ‘;’ ] hroledef|

hdeclarationi ::= heventi [ hiroledef[ hroledefi ] i ]

5.8.4 Events

(
hevent||‘sendi ::=’ h‘labelrecvlabeli’‘h(ilabel’]h‘from ’ih‘from(i’ ‘h,from’ih‘to,’iih‘‘claim,,’’ hhtotermlistii

[‘,‘’,’htermlistihtermlist‘)’ ‘;’ii‘)]’ ‘‘);’ ‘’ ;’

‘claim’ [ h hlabeli ::= ‘_’ htermi hfromi ::= hidi

htoi ::= hidi hclaimi ::= hidi


23
5.8.5 Tờ khai

hglobaldeclaration||‘‘usertypeuntrusted’ ’htermlistihtermlist::= hdeclarationii‘;‘;’ ’ i

hdeclaration||[ ‘secreti ::=’ ] ‘fresh[ ‘secret’ htermlist’ ] ‘const[i‘:


[’’‘:hhtypelist’termlisthtypelistii]i[‘;]‘’:‘;’ ’htypei ] ‘;’

||[ ‘secret’ ] ‘var’ htermlist[ htype‘ii,’] h‘;term’i ‘)’ ‘;’


‘secret’ htermlisti

| ‘inversekeys’ ‘(’ htermi ‘;’ ‘compromised’ htermlisti htypei ::= hidi

htypelisti ::= htypei { ‘,’ htypei }

5.8.6 Terms

hterm||| ‘h{i’::=htermlisttermlisthidi ii ‘‘)}’’ hkey‘)’i ‘(’ h

‘(’ htermlisti idi

hkeyi ::= htermi htermlisti ::= htermi { ‘,’ htermi }


24

Chapter 6

Mô hình hóa giao thức bảo mật


6.1 Giới thiệu
Các mô hình chính xác của một giao thức bảo mật để phân tích trong công cụ Scyther đòi hỏi một sự hiểu biết cơ
bản của mẫu biểu tượng tiềm ẩn. Mô hình này được giải thích chi tiết trong [1].
Khoảng nói, phân tích biểu tượng tập trung vào các khía cạnh sau:
• Thành phần tin nhắn hợp lý và chức năng dự định của họ trong giao thức (công cộng so với bí mật, mới
được tạo ra trong mỗi chạy hoặc liên tục)
• Cấu trúc tin nhắn (pairing, encryption, signing, hashing)

• Luồng thư (order, involved agents)

Nhiều yếu tố khác được abstracted đi. Ví dụ:, dây bit được abstracted vào điều kiện, bit dây xảy ra với xác suất
cẩu thả được abstracted đi, và hơn complext kiểm soát dòng chảy xây dựng như vòng thường được unfolded cho
một (thấp) số lượng hữu hạn của lần.

6.2 Ví dụ: khoá công cộng Needham-Schroeder


Ví dụ, chúng tôi hiển thị làm thế nào để mô hình một giao thức đơn giản.
Hình 6,1 Mô tả giao thức khoá công Needham-Schroeder. Để đơn giản, chúng tôi chỉ hiển thị yêu cầu bồi
thường của từng vai trò mà khởi đầu nonce ni là bí mật.
Chúng tôi bắt đầu mô tả giao thức bằng cách thêm một nhận xét nhiều dòng mô tả giao thức và các chi tiết
thú vị khác. Nhận xét nhiều dòng bắt đầu với/* và kết thúc với */.
/* * Needham-Schroeder protocol
*/

Giao thức sử dụng cơ sở hạ tầng công cộng/riêng khoá mặc định: một đại lý A có cặp khóa (PK (A), SK (A)).
Giao thức này có hai vai trò: vai chính intiator tôi và vai trò responder R. Chúng tôi cũng thêm một bình luận
đơn dòng, bắt đầu với//.
// The protocol description protocol ns3(I,R)

25

CHAPTER 6. MODELING SECURITY PROTOCOLS

Scyther làm việc với một mô tả dựa trên vai trò của các giao thức. Chúng tôi đầu tiên mô hình vai trò khởi
đầu. Vai trò này có hai giá trị cục bộ với vai trò: nonce được tạo bởi I và nonce được nhận. Chúng ta phải tuyên
bố cả hai.
role I { fresh ni: Nonce; var nr:
Nonce;

Chúng tôi bây giờ mô hình hành vi giao tiếp của giao thức. Needham-Schroeder có ba thông điệp, và vai trò
người khởi xướng gửi đầu tiên và cuối cùng. Lưu ý các nhãn (ví dụ,/1) ở cuối các từ khóa gửi và từ khoá: những
phục vụ chỉ để giữ lại thông tin của các mũi tên kết nối trong biểu đồ chuỗi thông báo.
send_1(I,R, {I,ni}pk(R) ); recv_2(R,I, {ni,nr}pk(I) );
send_3(I,R, {nr}pk(R) );

Cuối cùng, chúng tôi thêm các yêu cầu bảo mật của giao thức. Nếu không có tuyên bố như vậy, Scyther
không biết những gì cần phải được kiểm tra.
Ở đây chúng tôi đã chọn để kiểm tra bí mật của các tạo ra và nhận được nonce, và sẽ kiểm tra các thỏa thuận
không injective và đồng bộ hóa.
claim_i1(I,Secret,ni); claim_i2(I,Secret,nr);
claim_i3(I,Niagree); claim_i4(I,Nisynch);
}

Điều này hoàn tất các đặc điểm kỹ thuật của vai trò người khởi xướng.
Đối với giao thức đơn giản này, vai trò của bộ đáp ứng rất giống với vai trò người khởi xướng. Trong thực tế,
chỉ có một vài sự khác biệt:
1. Các từ khóa var và tươi có nơi đổi chỗ: ni đã được tạo ra bởi I và một giá trị mới được tạo ra ở đó, nhưng
đối với vai trò R đó là giá trị đã nhận và do đó một biến.
2. Các từ khóa gửi và recv đã hoán đổi những nơi.
3. Các yêu cầu phải có nhãn duy nhất, vì vậy họ đã thay đổi, và vai trò thực thi yêu cầu hiện nay là R thay vì
I.
Mô tả vai trò hoàn chỉnh cho bộ đáp ứng trông như thế này:
role R
{ var ni: Nonce; fresh
nr: Nonce;

recv_1(I,R, {I,ni}pk(R) ); send_2(R,I,


{ni,nr}pk(I) );

6.2. VÍ DỤ: KHÓA CÔNG KHAI NEEDHAM-SCHROEDER 27


recv_3(I,R, {nr}pk(R) );

claim_r1(R,Secret,ni); claim_r2(R,Secret,nr);
claim_r3(R,Niagree); claim_r4(R,Nisynch);
}
}

Tập tin mô tả giao thức đầy đủ cho giao thức Needham-Schroeder được đưa ra trong phụ lục A.
26

CHAPTER 6. MODELING SECURITY PROTOCOLS

msc Needham-Schroeder Public Key


pk(R ),sk (I ) pk(I ),sk (R )
I R

nonce ni
1
{ I,ni } pk ( R )

nonce nr
2
{ R,ni,nr } pk ( I )
3
{ nr } pk ( R )
i1 r1

secret(ni ) secret(ni )

Figure 6.1: A message sequence chart description


Chapter 7

Xác định các tính bảo mật


7.1 Chỉ định bảo mật

7.2 Chỉ định các tính xác thực


7.2.1 Aliveness
7.2.2 Đồng bộ hóa không tiêm
7.2.3 Thỏa Thuận không tiêm
7.2.4 Thỏa thuẩn về dữ liệu

Để xác định thỏa thuận dữ liệu, ví dụ, rằng vai trò tôi đồng ý với vai trò R trên một tập hợp các điều khoản, ví dụ
như các nonces ni và Nr, một trong những chèn hai tuyên bố:

1. Vào cuối của vai trò I, chèn yêu cầu bồi thường (I, cam kết, R, ni, Nr);
2. Trong R, ngay trước khi gửi cuối cùng (trong trường hợp của một giao thức có nhiều vai trò: cuối cùng gửi
rằng nhân quả đứng trước yêu cầu bồi thường trong vai trò I), chèn yêu cầu bồi thường (R, chạy, I, ni, Nr);
Ví dụ về việc sử dụng các tuyên bố này, xem "ns3. spdl" nhập tập tin trong phân phối Scyther. Để có định nghĩa
chính thức về các tín hiệu, xem [4].

29
30 CHAPTER 7. SPECIFYING SECURITY PROPERTIES
Chapter 8

Sử dụng công cụ Scyther GUI


Công cụ Scyther có thể được sử dụng trong hai cách chính. Đầu tiên, thông qua giao diện người
dùng đồ họa (GUI) và thứ hai, thông qua giao diện dòng lệnh. Đối với hầu hết người dùng lựa chọn
đầu tiên được ưa thích. Trong phần này chúng tôi chi tiết các sản lượng Scyther khi sử dụng thông
qua GUI.

8.1 Kết quả


Như được hiển thị trước, xác minh Needham-Schroeder khoá công cộng giao thức sản lượng kết quả
sau đây như trong hình 8,1.
Việc giải thích như sau: tất cả các yêu cầu của vai trò người khởi xướng ns3, tôi là chính xác cho
một số không bị chặn của chạy.
Thật không may, tất cả các tuyên bố của vai trò responder là sai. Scyther báo cáo rằng nó tìm thấy ít
nhất một cuộc tấn công cho mỗi người trong bốn tuyên bố. Chúng tôi có thể chọn để xem các cuộc tấn
công: điều này sẽ được hiển thị trong phần 8,3.
Trong cửa sổ kết quả, Scyther sẽ xuất ra một dòng duy nhất cho mỗi yêu cầu bồi thường. Dòng được
chia thành nhiều cột. Cột đầu tiên Hiển thị giao thức mà trong đó các yêu cầu bồi thường xảy ra, và thứ
hai cho thấy vai trò. Trong cột thứ ba, một nhận dạng yêu cầu duy nhất được hiển thị, của biểu mẫu p, l,
trong đó p là giao thức và l là nhãn yêu cầu bồi thường. . Cột thứ tư Hiển thị loại yêu cầu và thông số
yêu cầu.
Trong trạng thái tiêu đề, chúng ta tìm thấy hai cột. Cột thứ năm cho kết quả thực tế của quá trình
xác minh: nó sẽ mang lại thất bại khi yêu cầu bồi thường là sai, và OK khi yêu cầu bồi thường là chính
xác. Cột thứ sáu cải tiến tuyên bố trước đó: trong một số trường hợp, quá trình xác minh Scyther không
hoàn chỉnh (sẽ được khám phá chi tiết hơn trong phần tiếp theo). Nếu cột này trạng thái xác minh, thì
yêu cầu bồi thường là đúng. Nếu cột trạng thái giả mạo, thì yêu cầu bồi thường là sai. Nếu cột trống, sau
đó tuyên bố thất bại/OK phụ thuộc vào thiết lập giới hạn cụ thể.
Cột thứ bảy, ý kiến, phục vụ để giải thích tình trạng của các kết quả hơn nữa. Đặc biệt, cột chứa một
câu duy nhất. Chúng tôi mô tả các kết quả có thể dưới đây.

• Ít nhất X tấn công (s)

Một số cuộc tấn công đã được tìm thấy trong không gian nhà nước: Tuy nhiên, do khả năng
không thể giải quyết vấn đề, hoặc vì các chi nhánh và cấu trúc bround của việc tìm kiếm, chúng
tôi không thể chắc chắn rằng không có trạng thái tấn công khác.

31
30 CHAPTER 8. USING THE SCYTHER TOOL GUI

Hình 8.1: Scyther kết quả cho giao thức Needham-Schroeder

Trong thiết lập mặc định, Scyther sẽ ngừng quá trình xác minh sau khi tìm thấy một cuộc tấn công.

• Chính xác X tấn công (s)

Trong phạm vi statespace, có rất nhiều cuộc tấn công này, và không có những người khác.

• Ít nhất X mẫu (s)

• Chính xác X mẫu (s)

Chúng tương ứng chính xác với hai, nhưng xảy ra trong trường hợp yêu cầu ' reachable '. Như vậy,
các tiểu bang được tìm thấy là không thực sự tấn công nhưng các lớp học của các tiểu bang có thể
truy cập.

• Không có cuộc tấn công trong giới hạn

Không có cuộc tấn công nào được tìm thấy trong vùng statespace bị chặn, nhưng có thể có một cuộc
tấn công bên ngoài statespace bị chặn.

Không có cuộc tấn công


Không có cuộc tấn công được tìm thấy trong các (giáp hoặc không bị chặn) statespace, và một bằng
chứng có thể được xây dựng rằng không có cuộc tấn công ngay cả khi statespace không bị chặn. Do
đó, tài sản bảo mật đã được xác minh thành công.
8.2. BOUNDING THE STATESPACE 33

Lưu ý rằng vì tính chất của thuật toán, kết quả này thậm chí có thể thu được khi statespace được
bao bọc.

8.2 Bounding the statespace


Trong quá trình xác minh, công cụ Scyther khám phá một cây bằng chứng bao gồm tất cả các hành vi
có thể giao thức. Thiết lập mặc định là ràng buộc kích thước của cây này theo một cách nào đó, đảm
bảo rằng các thủ tục xác minh chấm dứt. Tuy nhiên, quan trọng, ngay cả khi kích thước của cây chứng
minh này được bao bọc, xác minh không bị giới chặn vẫn có thể đạt được.
Trong hầu hết các trường hợp, thủ tục xác minh sẽ chấm dứt và trả lại kết quả trước khi bao giờ đạt
đến ràng buộc. Tuy nhiên, nếu thủ tục xác minh đạt đến ràng buộc, điều này được báo cáo trong cửa sổ
kết quả, ví dụ như:

No attack within bounds

Điều này cần được hiểu như: Scyther không tìm thấy bất kỳ cuộc tấn công, nhưng vì nó đạt đến ràng
buộc, nó đã không khám phá những cây đầy đủ, và có thể là vẫn còn các cuộc tấn công trên giao thức.
Cách mặc định của giới hạn số lượng tối đa của chạy, hoặc phiên bản giao thức. Điều này có thể được
thay đổi trong tab cài đặt của cửa sổ chính. Nếu số lượng chạy tối đa là, ví dụ 5, và Scyther báo cáo
không có cuộc tấn công trong giới hạn, điều này có nghĩa rằng có tồn tại không có cuộc tấn công có liên
quan đến 5 chạy hoặc ít hơn. Tuy nhiên, có thể tồn tại các cuộc tấn công liên quan đến 6 chạy hoặc
nhiều hơn.
Đối với một số giao thức, tăng số lượng tối đa chạy có thể dẫn đến kết quả hoàn thành (tức là tìm một
cuộc tấn công hoặc đang được đảm bảo rằng không có cuộc tấn công), nhưng đối với các giao thức
khác, kết quả sẽ luôn là không có cuộc tấn công trong giới hạn.
Lưu ý rằng thời gian xác minh thường tăng theo cấp số nhân đối với số đếm lớn nhất.

8.3 Đồ thị tấn công


Trong hình 8,3 chúng tôi hiển thị một cửa sổ tấn công chi tiết hơn.
Các yếu tố cơ bản là mũi tên và một số loại hộp. Các mũi tên trong đồ thị đại diện cho các ràng
buộc đặt hàng (gây ra bởi tiền tố-closedness của các sự kiện trong vai trò giao thức, hoặc bởi các phụ
thuộc trong kiến thức xâm nhập). Các hộp đại diện cho việc tạo ra một sự kiện chạy, giao tiếp của một
chạy, và yêu cầu sự kiện.

8.3.1 Chạy
Mỗi trục dọc đại diện cho một chạy (một phiên bản của một giao thức vai trò). Như vậy, trong cuộc tấn
công này, chúng ta thấy rằng có hai chạy tham gia. Mỗi chạy bắt đầu với một hộp hình kim cương. Điều
này đại diện cho việc tạo ra một chạy, và được sử dụng để cung cấp thông tin về chạy .
Đối với chạy ở phía bên tay trái trong cuộc tấn công, chúng tôi có thông tin này:

Run #1
Agent2 in role I
I -> Agent2
R -> Agent1
32 CHAPTER 8. USING THE SCYTHER TOOL GUI

Figure 8.2: Scyther attack window

Mỗi chạy được gán một mã định danh chạy (ở đây 1), đó là một số tùy ý cho phép chúng tôi nhận dạng
duy nhất mỗi chạy. Chạy này thực hiện vai trò R của giao thức. Nó đang được thực hiện bởi một đại lý
được gọi là Agent1, những người nghĩ rằng ấp ông đang thơ chuyện với Agent2. Lưu ý rằng mặc dù
chạy 2 đang được thực hiện bởi Agent2, đại lý này không tin rằng ông đang nói chuyện với Agent1.

Run #2
Agent2 in role I
I -> Agent2
R -> Eve

Trong chạy bên phải, chúng ta thấy điều này chạy đại diện cho một phiên bản của vai trò của tôi. Từ
dòng thứ hai chúng ta có thể nhìn thấy những đại lý đang thực hiện chạy, và những người ông nghĩ rằng
ông là nói chuyện với. Trong ví dụ này, chạy được thực hiện bởi một đại lý được gọi là Agent2, người
nghĩ rằng vai trò bộ đáp ứng được thực hiện bởi các đại lý không đáng tin cậy Eve.1
Ngoài ra, các tiêu đề chạy chứa thông tin về các giá trị mới tạo (ví dụ: chạy 1 tạo nr # 1) và thông
tin về instantiation biến cục bộ (ví dụ: chạy 1 khởi tạo biến của nó ni với nonce ni # 2 hoặc chạy 2.

8.3.2Communication events
Gửi sự kiện biểu thị tin nhắn gửi. Việc gửi đầu tiên xảy ra trong cuộc tấn công này là sự kiện gửi đầu
tiên của 2 chạy.

send_1(Eve, { Agent#0, ni#2 }pk(Eve) )

Mỗi khi một tin nhắn được gửi đi, nó là một cách hiệu quả cho những kẻ xâm nhập. Trong trường
hợp này, bởi vì kẻ xâm nhập biết khóa bí mật SK (Eve) của các đại lý Eve, ông có thể giải mã thông
điệp và học được giá trị của nonce ni # 2.
Nhận các sự kiện tương ứng với sự tiếp thu thành công của một tin nhắn. Đầu tiên nhận sự kiện có
thể xảy ra trong cuộc tấn công này là lần đầu tiên nhận được sự kiện chạy 0.

recv_1(Agent#0, { Agent#0, ni#2 }pk(Agent#1) )

Điều này cho chúng ta biết rằng các Agent thực hiện điều này chạy, Agent # 1, đọc một thông báo
đó là dường như đến từ Agent # 1. Thông báo nhận được là {Agent # 0, ni # 2} PK (đại lý # 1): tên của
các agent mà ông nghĩ rằng ông là giao tiếp với và nonce ni # 2, mã hóa với chìa khóa công cộng của
mình.
Mũi tên đến không cho biết gửi thư trực tiếp. Thay vào đó, nó chỉ là một ràng buộc đặt hàng: thông
báo này chỉ có thể được nhận sau khi cái gì khác đã xảy ra. Trong trường hợp này, chúng ta thấy rằng
thư chỉ có thể nhận được sau khi chạy 2 gửi tin nhắn ban đầu của mình. Lý do cho điều này là nonce ni
# 2: những kẻ xâm nhập không thể dự đoán nonce này, và do đó phải đợi cho đến khi chạy 2 đã tạo ra
nó.
Trong đồ thị các mũi tên kết nối là màu đỏ và có một nhãn "xây dựng" với nó: điều này là do thực tế
là các tin nhắn gửi không tương ứng với các thông báo nhận được. Chúng tôi biết những kẻ xâm nhập
chỉ có thể xây dựng các tin nhắn được nhận sau khi gửi tin nhắn, và do đó nó phải là trường hợp mà ông
sử dụng thông tin từ các thông báo gửi để xây dựng các tin nhắn đó là nhận được. Các khả năng khác
bao gồm một mũi tên màu xanh lá cây và màu vàng. Một mũi tên màu vàng chỉ ra rằng một tin nhắn đã
được gửi đi, và nhận được trong cùng một hình thức chính xác: Tuy nhiên, các đại lý không đồng ý về
những người đã được gửi một tin nhắn cho ai. Do đó nó được gắn nhãn "chuyển hướng" bởi vì kẻ xâm
nhập phải có chuyển hướng thư. Một mũi tên màu xanh lá cây (không có trong hình) chỉ ra rằng một tin
nhắn được nhận chính xác giống như nó đã được gửi đi, đại diện cho một thông tin liên lạc bình thường
giữa hai đại lý.
Lưu ý rằng một sự kiện recv mà không có một mũi tên đến chỉ ra rằng một thuật ngữ được nhận có
thể được tạo ra từ kiến thức ban đầu của kẻ xâm nhập. Không có sự kiện như vậy trong ví dụ, nhưng
điều này có thể xảy ra thường xuyên. Ví dụ, nếu một vai trò đọc một thông điệp đơn giản chỉ chứa một
tên đại lý, kẻ xâm nhập có thể tạo ra thuật ngữ từ kiến thức ban đầu của mình.

1 Because this agent is talking to the untrusted agent, of course all information is leaked, and no guarantees can be
given.
34 CHAPTER 8. USING THE SCYTHER TOOL GUI

8.3.3 Tuyên bố
Chapter 9

Using the Scyther command-line


tools(Sử dụng công cụ dòng lệnh
Scyther)
Tất cả các tính năng được cung cấp bởi các GUI Scyther cũng có sẵn thông qua các công cụ dòng lệnh.
Ngoài ra, công cụ dòng lệnh cung cấp một số tính năng hiện không thể truy cập thông qua GUI.

Tùy thuộc vào nền tảng của bạn, thư mục Scyther chứa một trong những thực thi sau đây:

• Scyther/scyther-linux

• Scyther/scyther-w32

• Scyther/scyther-mac

Trong phần sau đây, chúng tôi giả định rằng phiên bản Linux được sử dụng. Nếu bạn có một phiên
bản khác nhau, xin vui lòng thay thế scyther-Linux ở dưới đây bởi các thực thi cho nền tảng của bạn.
Để có được một danh sách (một số) của các tùy chọn dòng lệnh, chạy thực thi với--trợ giúp chuyển đổi,
ví dụ như:

scyther-linux --help

Để phân tích giao thức Needham-Schroeder và tạo ra một tập tin. dot (ngôn ngữ

nhập cho công cụ Graphviz) cho các cuộc tấn công, sử dụng:

scyther-linux --dot-output --output=ns3-attacks.dot ns3.spdl The resulting output file can

sau đó được kết xuất bởi Graphviz, ví dụ:

dot -Tpdf -O ns3-attacks.dot

Điều này mang lại một số tập tin PDF ns3-Attacks. dot [. N]. PDF có chứa các đồ thị tấn công. Để có
được một danh sách đầy đủ hơn các tùy chọn dòng lệnh, chạy thực thi với--Expert--trợ giúp chuyển
đổi, ví dụ như:
scyther-linux --expert --help

37
38 CHAPTER 9. USING THE SCYTHER COMMAND-LINE TOOLS
Chapter 10

Advanced topics
10.1Mô hình hóa nhiều hơn một cặp khóa không đối xứng
Các phím không đối xứng thường được mô phỏng với hai chức năng: một chức năng để ánh xạ các tác
nhân của các phím công khai, và một chức năng mà bản đồ đại lý cho các khóa bí mật của họ.
Theo mặc định, mỗi đại lý x có cặp khóa công cộng/cá nhân (PK (x), SK (x)). Để mô hình các phím
không đối xứng khác, trước tiên chúng ta xác định hai chức năng, ví dụ như pk2 cho chức năng khóa
công khai và SK2 cho chức năng khóa bí mật.
const pk2: Function; secret sk2:
Function;

Chúng tôi cũng tuyên bố rằng các chức năng đại diện cho cặp khóa không đối xứng:
inversekeys (pk2,sk2);

Nếu định nghĩa theo cách này, một thuật ngữ được mã hóa bằng pk2 (x) chỉ có thể giải mã bằng
SK2 (x) và ngược lại.

10.2 Approximating equational theories


Ngữ nghĩa hoạt động nằm bên dưới Scyther hiện chỉ xem xét sự bình đẳng cú pháp: hai (Ground) điều
khoản là bình đẳng nếu và chỉ nếu họ là cú pháp tương đương. Tuy nhiên, có một số công trình xây
dựng mã hóa phổ biến được mô hình hóa tự nhiên hơn bằng cách sử dụng một số equalities. Ví dụ::

1. gab (mod N) and gba (mod N), để mô hình Diffie-Hellman lũy thừa.

2. k(A,B) and k(B,A), để mô hình các phím dài hạn hai chiều.
Mặc dù Scyther không cung cấp hỗ trợ trực tiếp cho các lý thuyết tương đương như vậy, có tồn tại một
cách đơn giản xấp xỉ.
Ý tưởng cốt lõi là thay vì mô hình hóa thuật ngữ bình đẳng, chúng tôi cung cấp cho kẻ thù với khả
năng tìm hiểu tất cả các thuật ngữ trong một lớp tương đương nếu ông học một trong những yếu tố của
nó. Ví dụ, đối với lớp tương đương {k (A, B), k (B, A)} chúng ta có thể cung cấp cho kẻ thù với khả
năng học k (B, A) từ k (A, B), và ngược lại. Chúng ta có thể mô hình này bằng cách giới thiệu một giao
thức Helper thích hợp (ký hiệu của tiền tố ' @ '):

39

40 CHAPTER 10. ADVANCED TOPICS

protocol @keysymmNaive(X) {
role X {
var Y: Agent;

recv_!1(X,X, k(X,Y) ); send_!2(X,X,


k(Y,X) );
Bởi vì vai trò có thể được khởi tạo cho bất kỳ đại lý X và Y, điều này bao gồm tất cả các tổ hợp các
đại lý có thể. Xấp xỉ ngây thơ ở trên có thể được cải thiện đáng kể. Một thiếu sót rõ ràng và thực tế có
liên quan là kẻ nghịch thù thường học các tin nhắn được mã hóa, nhưng không phải là chìa khóa. Trong
những trường hợp như vậy, chúng tôi vẫn muốn mô hình rằng {m} k (A, B) = {m} k (B, A). Do đó
chúng tôi điều chỉnh giao thức trợ giúp của chúng tôi:
protocol @keysymmInefficient(X,Y) {
role X {
var Y: Agent;

recv_!1(X,X, k(X,Y) ); send_!2(X,X,


k(Y,X) );
}
role Y {
var X: Agent; var m:
Ticket;

recv_!1(Y,Y, { m }k(X,Y) ); send_!2(Y,Y, { m }


k(Y,X) );
}
}
Nếu giao thức chứa các thuật ngữ thêm trong đó các phím đối xứng xuất hiện ở các vị trí khác,
chẳng hạn như mã hóa lồng nhau hoặc băm, chúng tôi sẽ thêm các vai trò khác. Xấp xỉ trên thường
không hiệu quả trong thực tế. Chúng tôi có thể cải thiện hiệu suất bằng cách làm cho các quy tắc giao
thức trợ giúp chặt chẽ hơn, tức là bằng cách khai thác thêm thông tin về giao thức. Ví dụ: nếu giao thức
truyền hai loại thư được mã hóa:

1. { I,nI,nR }k(I,R) , and

2. { nI }k(I,R) , sau đó chúng tôi thay đổi giao thức trợ giúp
theo cách sau:
protocol @keysymm(X,Y,Z) {
role X {
var Y: Agent;

recv_!1(X,X, k(X,Y) ); send_!2(X,X,


k(Y,X) );
}
role Y {
var X,Z: Agent; var
n1,n2: Nonce;
10.3. LẬP MÔ HÌNH Time-stamps VÀ QUẦY TOÀN CẦU 41
recv_!1(Y,Y, { Z,n1,n2 }k(X,Y) ); send_!2(Y,Y,
{ Z,n1,n2 }k(Y,X) );
}
role Z {
var X,Y: Agent; var
n1: Nonce;

recv_!1(Z,Z, { n1 }k(X,Y) ); send_!


2(Z,Z, { n1 }k(Y,X) ); }
}
Nói chung, một trong những thủ công sẽ kiểm tra giao thức và trích xuất tất cả các vị trí trong đó
một thuật ngữ từ một lớp tương đương xảy ra như là một subterm. Đối với mỗi vị trí này, chúng tôi mô
hình một vai trò thích hợp trong các giao thức trợ giúp. Điều này cũng được sử dụng để mô hình, ví dụ,
Diffie-Hellman lũy thừa. Đối với số mũ, chúng tôi giới thiệu một biểu tượng chức năng trừu tượng, ví
dụ như Exp, và một hằng số công cộng g. Sau đó chúng tôi giới thiệu một giao thức trợ giúp với các vai
trò để mô hình mà EXP (exp (g, X), Y) = exp (exp (g, Y), X). Trong thực tế, loại dưới đây đã được
chứng minh là cực kỳ hiệu quả, đến mức mà tất cả các cuộc tấn công được biết đến trên các giao thức
thế giới thực có thể được mô hình hóa bằng cách sử dụng "thực" lý thuyết tương đương, được tìm thấy
bởi Scyther khi sử dụng các xấp xỉ. Một caveat là trong khi xấp xỉ này hoạt động tốt cho bí mật và thỏa
thuận dữ liệu, nó có thể gây ra thông báo dựa trên thỏa thuận tính (chẳng hạn như đồng bộ hóa) không
thành công, bởi vì thông báo kiểm tra bình đẳng của họ là synchiến thuật. Các kiểm tra không bị ảnh
hưởng b....

10.3 Mô hình hóa time-stamps và bộ đếm toàn cầu


Mô hình giao thức cơ bản của scyther hiện không cung cấp hỗ trợ cho các biến được chia sẻ giữa
các chạy của một đại lý. Có hiệu quả, mỗi chạy bắt đầu với một "sạch Slate", độc lập của bất kỳ
chạy đã được thực hiện trước đó. Nói cách khác, trạng thái Cập Nhật toàn cầu không thể được mô
phỏng trực tiếp. Trong các phần sau đây chúng tôi cung cấp một số cách tiếp cận mô hình cho các
vấn đề thường gặp.

10.3.1 Mô hình hóa bộ đếm toàn cầu


Các bộ đếm tăng dần trên toàn cầu có thể được mô phỏng bằng các giá trị mới được tạo. Điều này đảm
bảo rằng mỗi chạy sử dụng một giá trị khác nhau. Mô hình này là thô trong ý nghĩa rằng người nhận
của một truy cập như vậy không thể kiểm tra xem nó là sự kế thừa của giá trị trước của truy cập.

10.3.2 Mô hình hóa time-stamps bằng cách sử dụng nonces


Có ít nhất hai cách để mô hình thời gian-tem. Các mô hình đầu tiên là thích hợp hơn cho các giao
thức nơi mà xác suất một thời gian nhất định dấu giá trị được chấp nhận bởi hai chạy là rất thấp. Điều
này xảy ra khi thời gian-tem có độ chính xác tuyệt vời hoặc khi hai chạy xảy ra chỉ tuần tự, có thể với
một số thời gian chậm trễ ở giữa. Trong trường hợp này, người ta có thể mô hình thời gian-tem như các
giá trị mới được tạo ra, ví dụ như, nonces. Để phục vụ cho một thực tế rằng kẻ nghịch thù thường biết
thời gian (và do đó cũng có thể dự đoán tem thời gian), chúng ta đã thêm một sự kiện gửi đến vai trò mà
cung cấp cho kẻ thù với giá trị của dấu thời gian mà sẽ được sử dụng. Ví dụ, chúng tôi có xu hướng gửi
với nhãn! T1 cho dấu thời gian T1 như trong ví dụ sau:
usertype Timestamp;

protocol MyProtocol(Server,Client) {
role Server{
fresh T1: Timestamp;

/* Time-stamps are unique per run */ send_!T1(Server, Server, T1);

...
/* Server uses time-stamp value */ send_2(Server,Client, { Server,
T1 }pk(Client) ); ...
}
}

10.3. Mô hình hóa time-stamps sử dụng biến


Mô hình thứ hai là thích hợp hơn khi nó là hợp lý mà hai chạy có thể chấp nhận cùng một thời gian giá
trị dấu. Điều này phổ biến cho các tem thời gian thô, hoặc cho các vai trò thường được thực hiện với
song song cao, chẳng hạn như vai trò máy chủ. Trong những trường hợp như vậy, người ta có thể thay
vào đó là dấu hiệu của các giá trị được xác định bởi kẻ nghịch thù. Trái ngược với các giải pháp trước
đó, điều này được thực hiện bởi trước một sự kiện nhận. Ví dụ:
usertype Timestamp;

protocol MyProtocol(Server,Client) {
role Server{
var T1: Timestamp;

/* Adversary chooses time-stamp value */ recv_!T1(Server, Server, T1);

...
/* Server uses time-stamp value */ send_2(Server,Client, { Server,
T1 }pk(Client) ); ...
}
}

10.4 Tấn công đa giao thức


Scyther có thể được sử dụng để kiểm tra cho cái gọi là tấn công đa giao thức (khái niệm liên quan
chặt chẽ là các cuộc tấn công crossprotocol và các cuộc tấn công giao thức được lựa chọn). Các cuộc
tấn công này phụ thuộc vào sự tương tác giữa các giao thức khác nhau (phụ): đôi khi kẻ thù có thể sử
dụng tin nhắn hoặc các thành phần tin nhắn từ một giao thức để tấn công khác. Để biết thêm thông tin
về loại tấn công chúng tôi đề cập đến [2, 3]. Cách dễ nhất để kiểm tra các cuộc tấn công đa giao thức
trong Scyther là kết hợp hai mô tả giao thức vào một tập tin duy nhất, tức là tạo ra một tập tin. spdl mới
và dán vào tập tin này hai khác tệp tin .Spdl. Các mô hình tệp kết quả một môi trường trong đó cả hai
giao thức đang chạy. Sử dụng Scyther để đánh giá các yêu cầu trong tập tin kết hợp.
44 CHAPTER 10. ADVANCED TOPICS
Chapter 11

Further reading
46 CHAPTER 11. FURTHER READING

43
Tham khảo
[1] Cas Cremers and Sjouke Mauw. Operational Semantics and Verification of Security Protocols.
Information Security and Cryptography. Springer, 2012.

[2] C.J.F. Cremers. Feasibility of multi-protocol attacks. In Proc. of The First International Conference
on Availability, Reliability and Security (ARES), pages 287–294, Vienna, Austria, April 2006. IEEE
Computer Society.

[3] J. Kelsey, B. Schneier, and D. Wagner. Protocol interactions and the chosen protocol attack. In B.
Christianson, B. Crispo, T.M.A. Lomas, and M. Roe, editors, Fifth International Workshop on
Security Protocols, volume 1361 of LNCS, pages 91–104. Springer, 1997.

[4] G. Lowe. A hierarchy of authentication specifications. In Proc. 10th IEEE Computer Security
Foundations Workshop (CSFW), pages 31–44. IEEE, 1997.
48 BIBLIOGRAPHY

45
Phụ Lục A

Thông số kỹ thuật đầy đủ cho khoá


công cộng Needham-Schroeder
/*
* Needham-Schroeder protocol
*/

// The protocol description

protocol ns3(I,R)
{ role I
{ fresh ni: Nonce; var
nr: Nonce;

send_1(I,R, {I,ni}pk(R) ); recv_2(R,I,


{ni,nr}pk(I) ); claim(I,Running,R,ni,nr);
send_3(I,R, {nr}pk(R) );

claim_i1(I,Secret,ni); claim_i2(I,Secret,nr);
claim_i3(I,Alive); claim_i4(I,Weakagree);
claim_i5(I,Commit,R,ni,nr); claim_i6(I,Niagree);
claim_i7(I,Nisynch);
}

role R
{ var ni: Nonce; fresh nr: Nonce;
recv_1(I,R, {I,ni}pk(R) );

50 APPENDIX A. FULL SPECIFICATION FOR NEEDHAM-SCHROEDER PUBLIC KEY


claim(R,Running,I,ni,nr); send_2(R,I,
{ni,nr}pk(I) ); recv_3(I,R, {nr}pk(R) );

claim_r1(R,Secret,ni); claim_r2(R,Secret,nr);
claim_r3(R,Alive); claim_r4(R,Weakagree);
claim_r5(R,Commit,I,ni,nr); claim_r6(R,Niagree);
claim_r7(R,Nisynch);
}
}

Empty, 19 equational theories, 39


Index event
claim, 18
match, 19 not
@, 20 match, 19
!, 18 recv, 18 send,
18
abbreviate, 21 Agent, 17 events, 18 exactly X attack(s), 32 exactly X
agreement (on messages), 19 pattern(s), 32 exponentiation, see Diffie-Hellman
agreement on data, 19, 29 Alive, exponentiation
18 asymmetric key multiple pairs
per agent, 39 freshly generated value, 16 Function,
asymmetric keys, 17 at 17
least X attack(s), 31 at
least X pattern(s), 32 global constant, 16 global
atomic term, 15 attack counter, 41 global
graph, 33 attack window, declarations, 21
33 GUI, 31 using Scyther without GUI,
37
bidirectional keys, 39
hash functions, 17
BNF, 23
hashfunction, 17 helper
case-sensitive, 15 chosen protocol, 20, 39
protocol attacks, 42 claim,
identifier, 15 import file, 22
18 claim event, 18
include, 22 input file, 22
command-line tools, 37
installing Scyther, 9 internal
comments, 15 Commit, 19,
computation events, 19 k(X,Y),
29 communication event, 35
16
const, 21 constant, 16
construct, 35 counter, see macro, 21 match event, 19 message agreement,
global counter cross-protocol 19 multi-protocol attacks, 42 multiple
attacks, 42 asymmetric key pairs per agent, 39 multiple
roles per agent, 23
data agreement, 19, 29 define
macro, 21 Diffie-Hellman Needham-Schroeder protocol, 25
exponentiation, 39 downloading
Scyther, 9
52 INDEX

47
Niagree, 19 Nisynch, 19 no attacks,
32 no attacks within bounds, 32
non-injective agreement, 19, 29
non-injective synchronisation, 19
Nonce, 17 nonce, 16 not match
event, 19
NS, see Needham-Schroeder protocol
one role per agent, 23 one-role-per-
agent, 23 pairing, 16 pattern match
events, 19 pk(X), 17 protocol definition,
20 quick start tutorial, 11 random value,
16 Reachable, 19 read, 18 recv, 18 role
definition, 20 run, 33 Running, 19, 29
Scyther website, 5
Secret, 18 security
properties, 18
send, 18 sk(X), 17 SKR, 18
symmetric keys, 16
symmetric-role protocol, 21
synchronisaton, 19 syntactic
equality, 39
Ticket, 17 time-
stamps, 41–42
tupling, 16 usertype,
17 var, 16 variable,
16 verification, 32
Weakagree, 18 website, see
Scyther website whitespace,
15

You might also like