Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 89 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
89
Dung lượng
4,5 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA DƯƠNG TUẤN QUANG PHÂN TÍCH ĐỊNH LƯỢNG LUỒNG TIN TRONG BẢO MẬT CHƯƠNG TRÌNH ĐA LUỒNG Chuyên ngành Mã số : Kỹ thuật điện tử : 60.52.02.03 LUẬN VĂN THẠC SĨ KỸ THUẬT Người hướng dẫn khoa học : TS NGƠ MINH TRÍ Đà Nẵng, năm 2017 LỜI CAM ĐOAN Tôi xin cam đoan nội dung luận văn “Phân tích định lượng luồng tin bảo mật chương trình đa luồng” khơng phải chép luận văn cơng trình có từ trước Các số liệu, kết nêu luận văn trung thực chưa công bố cơng trình khác Tác giả luận văn Dương Tuấn Quang MỤC LỤC MỞ ĐẦU CHƯƠNG CƠ SỞ LÝ THUYẾT BẢO MẬT THÔNG TIN 1.1 Lý thuyết xác suất .4 1.2 Lý thuyết thông tin 1.2.1 Khái niệm thông tin 1.2.2 Lượng tin 1.3 Entropy 1.3.1 Shannon entropy 1.3.2 Min-entropy 10 1.4 Kết luận chương 10 CHƯƠNG LƯỢNG TIN RÒ RỈ CỦA CHƯƠNG TRÌNH .11 2.1 Bảo mật luồng thông tin 11 2.1.1 Phân tích định tính luồng thông tin 12 2.1.2 Phân tích định lượng luồng thơng tin 12 2.2 Lượng tin rò rỉ 14 2.2.1 Lượng tin rò rỉ theo Shannon entropy 16 2.2.2 Lượng tin rò rỉ theo min-entropy .17 2.3 Kết luận chương 18 CHƯƠNG LƯỢNG TIN RỊ RỈ CỦA CHƯƠNG TRÌNH ĐA LUỒNG 19 3.1 Bảo mật luồng thông tin chương trình đa luồng 19 3.1.1 Chương trình đa luồng .19 3.1.2 Tính bảo mật chương trình đa luồng 19 3.1.3 Ảnh hưởng lập lịch chương trình đa luồng 20 3.1.4 Mơ hình chương trình đa luồng .21 3.2 Lượng tin rị rỉ chương trình đa luồng .22 3.2.1 Lượng tin rị rỉ theo vệt chương trình 22 3.2.2 Lượng tin rò rỉ chương trình đa luồng 24 3.2.3 Ví dụ minh hoạ 24 3.2.4 Ví dụ minh hoạ 26 3.2.5 Ví dụ minh hoạ 28 3.2.6 Ví dụ minh hoạ 30 3.3 Kết luận chương 34 CHƯƠNG XÂY DỰNG CHƯƠNG TRÌNH MƠ PHỎNG PHÂN TÍCH ĐỊNH LƯỢNG LUỒNG TIN 35 4.1 Tổng quan chương trình mơ 35 4.2 Cấu trúc chung chương trình mơ 35 4.3 Thuật tốn chương trình mơ 37 4.3.1 Thuật tốn phân tích khơng gian trạng thái .37 4.3.2 Thuật tốn tính tốn lượng tin rò rỉ 39 4.4 Tính tốn lượng tin rị rỉ với min-entropy 40 4.5 Tính tốn lượng tin rò rỉ với Shannon entropy .41 4.6 Kết tính tốn mơ 41 4.7 Đánh giá chương trình mơ 42 4.8 Kết luận chương 42 KẾT LUẬN VÀ KIẾN NGHỊ 43 DANH MỤC TÀI LIỆU THAM KHẢO 44 PHỤ LỤC PHÂN TÍCH ĐỊNH LƯỢNG LUỒNG TIN TRONG BẢO MẬT CHƯƠNG TRÌNH ĐA LUỒNG Học viên: Dương Tuấn Quang Chuyên ngành: Kỹ thuật điện tử Mã số: 60.52.02.03 Khóa: K31 KTĐT ĐHĐN Trường Đại học Bách khoa – Tóm tắt – Luận văn nghiên cứu vấn đề bảo mật chương trình đa luồng, đồng thời xây dựng công cụ mô tự động phân tích định lượng luồng tin chương trình đa luồng Cơng cụ dựa vào phương pháp phân tích định lượng người cơng lựa chọn lập lịch để thực thi chương trình đa luồng, từ suy số thơng tin định liệu bí mật Phương pháp lập lịch sử dụng để xây dựng mơ hình chuyển trạng thái chương trình đa luồng, tính tốn lượng tin rị rỉ liệu bí mật Luận văn mơ tả thuật tốn chương trình tổng hợp kết số ví dụ để kiểm chứng độ xác chương trình Từ khóa – bảo mật; đo lường; định lượng luồng tin; lượng tin rị rỉ; cơng cụ; QUANTITATIVE INFORMATION FLOW ANALYSIS OF MULTITHREADED PROGRAM Abstract – This thesis studies the security of multi-threaded programs and presents a tool for analysing quantitative information flow (QIF) for multi-threaded programs written in a core imperative language The aim of the tool is to measure the leakage of secret data The tool is based on a method of the quantitative analysis where the attacker is able to select the scheduling policy to attack the program The scheduling policy is used to construct the execution model of the program We outline the workings of the tool and summarise results derived from running the tool on a range of case studies Keywords – security; measurement; quantitative information flow; information leakage; tool; DANH MỤC CÁC HÌNH Số hiệu Tên hình Trang 3.1 Cây trạng thái chương (ProbSpace)).probtrace; if number_of_transition2 >= for m = 1:number_of_transition2 secret_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).secret; probdis_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).probdis; end for m = 1:number_of_transition2 secret = secret_temp(m,:); % Line of code Case3_Thread1; [ProbSpace,state,number_of_transition3] = ProbUpdate(state,state_end,observe,secret,probdis_temp(m,:),number_of_tra nsition2,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end else for m = 1:number_of_transition2 secret = ProbEnv(length(ProbEnv)).secret; % Line of code Case3_Thread1; [ProbSpace,state,number_of_transition3] = ProbUpdate(state,state_end,observe,secret,ProbSpace(length(ProbSpace)).pr obdis,number_of_transition2,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end end elseif (x == 4) % Line of code Case3_Thread22; [ProbSpace,state,number_of_transition1] = ProbUpdate(state,'',observe,secret,prob_distribution,1,'begin'); ProbEnv = [ProbEnv,ProbSpace]; prev_probtrace = ProbSpace(length(ProbSpace)).probtrace; if number_of_transition1 >= for m = 1:number_of_transition1 secret_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).secret; probdis_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).probdis; end for m = 1:number_of_transition1 secret = secret_temp(m,:); % Line of code Case3_Thread21; [ProbSpace,state,number_of_transition2] = ProbUpdate(state,'',observe,secret,probdis_temp(m,:),number_of_transition 1,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end else for m = 1:number_of_transition1 secret = ProbEnv(length(ProbEnv)).secret; % Line of code Case3_Thread21; [ProbSpace,state,number_of_transition2] = ProbUpdate(state,'',observe,secret,ProbSpace(length(ProbSpace)).probdis,n umber_of_transition1,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end end prev_probtrace = ProbSpace(length(ProbSpace)).probtrace; if number_of_transition2 >= for m = 1:number_of_transition2 secret_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).secret; probdis_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).probdis; end for m = 1:number_of_transition2 secret = secret_temp(m,:); % Line of code Case3_Thread1; [ProbSpace,state,number_of_transition3] = ProbUpdate(state,state_end,observe,secret,probdis_temp(m,:),number_of_tra nsition2,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end else for m = 1:number_of_transition2 secret = ProbEnv(length(ProbEnv)).secret; % Line of code Case3_Thread1; [ProbSpace,state,number_of_transition3] = ProbUpdate(state,state_end,observe,secret,ProbSpace(length(ProbSpace)).pr obdis,number_of_transition2,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end end end end % PROCESS DATA % Create another structure array to hold all "end state" elements ProbTerminate = struct('state',{},'observe',{},'secret',{},'probdis',{},'probtrace',{}); for k = : length(ProbEnv) thisStruct = ProbEnv(k); thisString = thisStruct.state; if strcmp(thisString, 'end') ProbTerminate = [ProbTerminate,thisStruct]; end end % Remove the identical elements in structure array isUnique = true(size(ProbTerminate)); for ii = 1:length(ProbTerminate)-1 for jj = ii+1:length(ProbTerminate) if isequal(ProbTerminate(ii),ProbTerminate(jj)) isUnique(ii) = false; break; end end end ProbTerminate(~isUnique) = []; % CALCULATE LEAKAGE % Calculate final uncertainty % Renyi = zeros(1,length(ProbTerminate)); % final_uncertainty = 0; % % for i=1:length(ProbTerminate) % Renyi(i) = -log2(max(ProbTerminate(i).probdis)); % final_uncertainty = final_uncertainty + ProbTerminate(i).probtrace * Renyi(i); % end % % % Calculate leakage % initial_uncertainty = -log2(max(initial_distribution)); % % leakage = initial_uncertainty - final_uncertainty; % % disp('Leakage of program'); disp(leakage); % Calculate final uncertainty Renyi = zeros(1,length(ProbTerminate)); Shannon = zeros(1,length(ProbTerminate)); final_uncertainty_Renyi = 0; final_uncertainty_Shannon = 0; for i=1:length(ProbTerminate) Renyi(i) = -log2(max(ProbTerminate(i).probdis)); Shannon(i) = -sum(ProbTerminate(i).probdis * log2(ProbTerminate(i).probdis)); final_uncertainty_Renyi = final_uncertainty_Renyi + ProbTerminate(i).probtrace * Renyi(i); final_uncertainty_Shannon = final_uncertainty_Shannon + ProbTerminate(i).probtrace * Shannon(i); end % Calculate leakage secret = [0 3]; [initial_uncertainty_Renyi initial_uncertainty_Shannon] = entropy(secret,initial_distribution); leakage_Renyi = initial_uncertainty_Renyi - final_uncertainty_Renyi; leakage_Shannon = initial_uncertainty_Shannon final_uncertainty_Shannon; disp('Leakage of program:'); disp(leakage_Renyi); disp(leakage_Shannon); Case4_QIF.m % % % % % % % % Quantitative informative flow Program, S is bit integer O := 0; if (O = 0) then O = S / else O = S mod 2; || O := 1; S = S mod 4; O := S || O := 0; clear all; close all; % Multithreaded program N = 1; % Number of times to run program % C1 || C2 C3 || C4 % possible cases: (1) C1 C2 C3 C4, (2) C1 C2 C4 C3, (3) C2 C1 C3 C4, (4) C2 C1 C4 C3 % Declare variables with distribution secret = [0 10 11 12 13 14 15]; initial_distribution = [.0625 0625 0625 0625 0625 0625 0625 0625 0625 0625 0625 0625 0625 0625 0625 0625]; prob_distribution = initial_distribution; observe = []; thread_prob = [0.25 0.25 0.25 0.25]; global state; state = 1; state_end = 'end'; prob_trace = 1; ProbEnv = struct; ProbEnv.state = state; ProbEnv.observe = observe; ProbEnv.secret = secret; ProbEnv.probdis = prob_distribution; ProbEnv.probtrace = prob_trace; state = state + 1; % STATE SPACE EXPLORATION for x=1:4 % Random choose between Thread1 or Thread2 with uniform distribution % r = rand; % x = sum(r >= cumsum([0, thread_prob])); % x = 1; % Testing purpose % Update distribution at each line of code secret = [0 10 11 12 13 14 15]; prev_probtrace = 1; observe = 0; if (x==1) % Case 1: C1 C2 C3 C4 % Line of code Case4_Thread1; [ProbSpace,state,number_of_transition1] = ProbUpdate(state,'',observe,secret,prob_distribution,1,'begin'); ProbEnv = [ProbEnv,ProbSpace]; prev_probtrace = ProbSpace(length(ProbSpace)).probtrace; if number_of_transition1 >= for m = 1:number_of_transition1 secret_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).secret; probdis_temp(m,:) = ProbEnv(length(ProbEnv)-m+1).probdis; end for m = 1:number_of_transition1 secret = secret_temp(m,:); % Line of code Case4_Thread2; [ProbSpace,state,number_of_transition2] = ProbUpdate(state,'',observe,secret,probdis_temp(m,:),number_of_transition 1,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end else for m = 1:number_of_transition1 secret = ProbEnv(length(ProbEnv)).secret; % Line of code Case4_Thread2; [ProbSpace,state,number_of_transition2] = ProbUpdate(state,'',observe,secret,ProbSpace(length(ProbSpace)).probdis,n umber_of_transition1,prev_probtrace); ProbEnv = [ProbEnv,ProbSpace]; end end ... CHƯƠNG LƯỢNG TIN RÒ RỈ CỦA CHƯƠNG TRÌNH ĐA LUỒNG 19 3.1 Bảo mật luồng thơng tin chương trình đa luồng 19 3.1.1 Chương trình đa luồng .19 3.1.2 Tính bảo mật chương trình đa luồng ... Ảnh hưởng lập lịch chương trình đa luồng 20 3.1.4 Mơ hình chương trình đa luồng .21 3.2 Lượng tin rò rỉ chương trình đa luồng .22 3.2.1 Lượng tin rị rỉ theo vệt chương trình ... 1.4 Kết luận chương 10 CHƯƠNG LƯỢNG TIN RỊ RỈ CỦA CHƯƠNG TRÌNH .11 2.1 Bảo mật luồng thông tin 11 2.1.1 Phân tích định tính luồng thơng tin 12 2.1.2 Phân tích định