質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Server+

Server+は、IT業界団体CompTIAが認定しているサーバー業務に関する資格です。サーバーのHW/SW構築・メンテナンス・仮想化など、サーバー運営上の運用・管理において幅広く対応できるスキルを評価します。

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

1325閲覧

仮想アドレス空間中の指定したアドレスにアクセスした瞬間にプロセスを停止したい

dsf185

総合スコア3

Server+

Server+は、IT業界団体CompTIAが認定しているサーバー業務に関する資格です。サーバーのHW/SW構築・メンテナンス・仮想化など、サーバー運営上の運用・管理において幅広く対応できるスキルを評価します。

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/06/30 10:45

実現したいこと

Linux(Ubuntu-20.04-LTS)上で動作するSSLサーバープログラム(OpenSSLを利用)が外部からリクエストを受けたときに,サーバープログラムがサーバー秘密鍵にアクセスする瞬間までにカーネルに要求する物理メモリのページ数を知りたいです.

上記を実現するために,以下の手順を考えています.
0. SSLサーバプログラムを起動し,そのサーバーに対して外部からSSL通信リクエストをかける

  1. 秘密鍵が格納されている仮想アドレスを特定し,プログラムがそのアドレスにアクセスした瞬間にプログラムを停止する
  2. 手順1から手順2の間にサーバープログラムがカーネルに要求したメモリページ数を記録する

###知りたいこと
上の手順2を実現するために,プログラムが持つ仮想アドレス空間中の指定したアドレスにプログラムがアクセスしたときにプログラムを停止させる方法はあるのでしょうか.

###SSLサーバソースコード
参考までに,OpenSSLを用いた簡易SSLサーバープログラムを載せておきます.

C++

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <unistd.h> 5#include <sys/socket.h> 6#include <arpa/inet.h> 7#include <iostream> 8 9#include <openssl/ssl.h> 10#include <openssl/err.h> 11#include <openssl/crypto.h> 12#include <openssl/x509.h> 13//#include "./include/dump.h" 14 15using namespace std; 16 17int main() { 18 SSL_CTX *ctx; 19 SSL *ssl; 20 21 int ret; 22 int server, client, sd; 23 int port = 1234; 24 const char crt_file[] = "/home/fuden/ssl/server.crt"; 25 const char key_file[] = "/home/fuden/ssl/server.key"; 26 27 struct sockaddr_in addr; 28 socklen_t size = sizeof(struct sockaddr_in); 29 30 char buf[1024]; 31 32 char body[] = "Hello World"; 33 char header[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 11\r\nConnection: keep-alive\r\n"; 34 char msg[1024]; 35 36 SSL_load_error_strings(); 37 SSL_library_init(); 38 OpenSSL_add_all_algorithms(); 39 40 ctx = SSL_CTX_new(TLS_server_method()); 41 SSL_CTX_use_certificate_file(ctx, crt_file, SSL_FILETYPE_PEM); 42 SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM); 43 44 server = socket(PF_INET, SOCK_STREAM, 0); 45 bzero(&addr, sizeof(addr)); 46 addr.sin_family = AF_INET; 47 addr.sin_addr.s_addr = INADDR_ANY; 48 addr.sin_port = htons(port); 49 50 bind(server, (struct sockaddr*)&addr, sizeof(addr)); 51 listen(server, 10); 52 53 while(1) { 54 client = accept(server, (struct sockaddr*)&addr, &size); 55 56 ssl = SSL_new(ctx); 57 SSL_set_fd(ssl, client); 58 59 if (SSL_accept(ssl) > 0) { 60 SSL_read(ssl, buf, sizeof(buf)); 61 snprintf(msg, sizeof(msg), "%s\r\n%s", header, body); 62 SSL_write(ssl, msg, strlen(msg)); 63 } 64 65 sd = SSL_get_fd(ssl); 66 SSL_free(ssl); 67 close(sd); 68 } 69 70 close(server); 71 SSL_CTX_free(ctx); 72 73 return EXIT_SUCCESS; 74}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分が作ったプログラムなので、秘密鍵を使う時点で止めればいいのでは?

そもそも、

カーネルに要求する物理メモリのページ数

とは何でしょう?ページインのことですか?
それはアプリケーションプログラムがカーネルに要求する物では無いですし、他のプロセスのメモリ使用状況に依存します。

投稿2020/06/30 11:44

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dsf185

2020/06/30 12:46

> 秘密鍵を使う時点で止めればいいのでは? OSSであるOpenSSLを使ってプログラムを書いたため,秘密鍵を使う箇所が今のところ不明です.仮想アドレス空間内の秘密鍵格納されているアドレスは把握できるので,そのアドレスを指定してプログラムを止める方法を探していました. ライブラリ内のコードにbreakポイントを張る方法はあるのでしょうか.もし可能であれば,OpenSSLのソースコードを読み解き,秘密鍵ファイルを使う箇所で止めればよさそうです. > 「カーネルに要求する物理メモリのページ数」とは何でしょう?... 表現が誤っておりました.申し訳ございません.サーバープロセスがリクエストを受けてから,リクエストのデータや秘密鍵を物理メモリ上で扱うために物理メモリが割り当てられると認識していて,ページインも含めてその量を知りたいのですが,それは他のプロセスのメモリ使用状況によるということでしょうか.他のプロセスによって物理メモリが枯渇していれば割り当てられないこともある,といったことでしょうか?
y_waiwai

2020/06/30 13:02

> サーバープロセスがリクエストを受けてから,リクエストのデータや秘密鍵を物理メモリ上で扱うために物理メモリが割り当てられると認識していて, この前提が間違っている場合はどうしましょう
otn

2020/06/30 13:11

そもそも、何故そんなものを知りたいと思ったのかと言うところから、間違っている可能性も高いです。
dsf185

2020/06/30 14:38

@y_waiwaiさん リクエストを受ける前からメモリ上に秘密鍵が置かれている可能性があるということでしょうか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問