gnupg 2.1.16 khối đang chờ entropy


9

Các bản phát hành của gnupg từ khối 2.1.16 (hiện tại là 2.1,17) chỉ chờ entropy trong lần gọi đầu tiên .

Lưu ý: đây không phải là một nỗ lực để tạo khóa, chỉ để giải mã một tệp và khởi động tác nhân.

Lần đầu tiên gpg-agent được khởi động, trực tiếp với gpg2 file.gpghoặc sử dụng một ứng dụng như pass, pinentry xuất hiện và một khi tôi nhập cụm mật khẩu của mình và nhấn Enternó trong khoảng 15 giây.

Tất cả các cuộc gọi tiếp theo, trong cửa sổ của cache-ttl mặc định, được thực hiện ngay lập tức.

Chạy ở --debug-allchế độ, khoảng thời gian treo xảy ra in 1 :

gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
...

Tôi đã cài đặt các công cụ rng để bổ sung cho nhóm entropy:

cat /proc/sys/kernel/random/entropy_avail 
4094

và so sánh với một máy tính với cùng một phiên bản của gnupg mà không có RNG-tools, hoặc haveged cài đặt, mà triển lãm không chậm trễ:

cat /proc/sys/kernel/random/entropy_avail
3783

Vì vậy, dường như có đủ entropy trong hồ bơi. Điều này đã được thử nghiệm trên hạt nhân 4.8.13 và 4.9.

Có gpg sử dụng một hồ bơi khác nhau? Làm cách nào tôi có thể cung cấp đủ entropy hoặc loại bỏ độ trễ 15 giây khi bắt đầu tác nhân?



1. Nhật ký gỡ lỗi đầy đủ .


1
Bạn đã cài đặt rng-toolsnhư giải thích ở đây? serverfault.com/questions/214605/gpg-not-enough-entropy
aurelien

1
Vâng, tôi đã đề cập rõ ràng trong câu hỏi của tôi. Nếu các liên kết của chúng tôi dễ truy cập hơn , bạn có thể đã nhận thấy :)
jasonwryan

1
đúng @jasonwryan Tôi đã bỏ lỡ dòng đó: - /
aurelien

Câu trả lời:


2

Tôi nghĩ rằng tôi biết những gì đang xảy ra. Trong tác nhân / gpg-agent.c của gnupg, hàm này xử lý các thông báo từ libgcrypt.

/* This is our callback function for gcrypt progress messages.  It is
   set once at startup and dispatches progress messages to the
   corresponding threads of the agent.  */
static void 
agent_libgcrypt_progress_cb (void *data, const char *what, int printchar,
                             int current, int total)
{
  struct progress_dispatch_s *dispatch;
  npth_t mytid = npth_self ();

  (void)data;

  for (dispatch = progress_dispatch_list; dispatch; dispatch = dispatch->next)
    if (dispatch->ctrl && dispatch->tid == mytid)
      break;
  if (dispatch && dispatch->cb)
    dispatch->cb (dispatch->ctrl, what, printchar, current, total);

  /* Libgcrypt < 1.8 does not know about nPth and thus when it reads
   * from /dev/random this will block the process.  To mitigate this
   * problem we take a short nap when Libgcrypt tells us that it needs
   * more entropy.  This way other threads have chance to run.  */
#if GCRYPT_VERSION_NUMBER < 0x010800 /* 1.8.0 */
  if (what && !strcmp (what, "need_entropy"))
    npth_usleep (100000); /* 100ms */
#endif
}

Phần cuối cùng với npth_us ngủ đã được thêm vào giữa 2.1.15 và 2.1.17. Vì điều này được biên dịch có điều kiện nếu libgcrypt cũ hơn 1.8.0, nên cách khắc phục đơn giản sẽ được biên dịch lại gnupg so với libgcrypt 1.8.0 hoặc sau đó không may là phiên bản đó dường như chưa tồn tại.

Điều kỳ lạ là, nhận xét về việc đọc libgcrypt / dev / ngẫu nhiên là không đúng. Stracing tác nhân tiết lộ nó đọc từ / dev / urandom và sử dụng tòa nhà getrandom (2) mới, mà không chặn. Tuy nhiên, nó sẽ gửi nhiều tin nhắn Need_entropy, khiến npth_us ngủ bị chặn. Xóa những dòng đó khắc phục vấn đề.

Tôi nên đề cập rằng npth dường như là một loại thư viện đa nhiệm hợp tác và npth_us ngủ có lẽ là cách mang lại, vì vậy có lẽ tốt hơn là giảm đáng kể sự chậm trễ đó, chỉ trong trường hợp libgcrypt quyết định chặn một ngày nào đó. (1ms là không đáng chú ý)


Công việc tốt đẹp. Vì vậy, cho đến khi libgcrypt 1.8.0 được phát hành (hiện tại tôi đang ở 1.7.5), tôi bị mắc kẹt với nó. Có vẻ kỳ lạ là số lượng entropy thực tế có sẵn không ảnh hưởng đến việc chặn.
jasonwryan

Vâng, 1.7.5 là bản mới nhất hiện có. Nếu bạn sẵn sàng vá, có thể sửa bằng cách xóa 2 số không. 4 để sửa bình luận. :) BTW Tôi có vấn đề tương tự, tôi thực sự không nhận thấy.
stribika

Tôi chỉ nhận thấy vì nó chỉ ảnh hưởng đến một trong các máy của tôi và loại phương sai đó thực sự kích hoạt OCD của tôi. Tôi sẽ xem nếu các bản vá giúp. Chúc mừng.
jasonwryan

Áp dụng bản vá này và cùng một cách chặn (Need_entropy). Ừ!
jasonwryan

Bạn có chắc chắn phiên bản đúng của gpg-agent được bắt đầu không? Nếu bạn dựa vào gpg để khởi động nó, nó luôn nằm trong mặc định / usr / bin / gpg-agent. Bạn có thể bắt đầu nó bằng tay với killall gpg-agent; /path/to/gpg-agent --daemon.
stribika
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.