2024年12月4日に発表された変更点

2024年12月4日にProtocol Buffersに関して発表された変更点です。

v30において、C++用のProtobufデバッグAPI(Protobuf AbslStringify、proto2::ShortFormatproto2::Utf8FormatMessage::DebugStringMessage::ShortDebugStringMessage::Utf8DebugString を含む)を修正し、debug_redactでアノテーションされた機密フィールドをリダクション(墨消し)する予定です。これらのAPIの出力にはプロセスごとにランダム化されたプレフィックスが含まれるため、ProtobufのTextFormatパーサーでは解析できなくなります。

動機

現在、ProtobufのデバッグAPIは、proto内のすべてのフィールドを人間が読める形式で出力します。これにより、開発者が機密フィールドを含むProtobufのデバッグ出力を誤ってログに記録してしまい、プライバシーに関するインシデントにつながる可能性があります。

機密フィールドにアノテーションを付ける方法

フィールドを機密としてマークするには2つの方法があります。

  • フィールドオプション debug_redact = true を使用して、フィールドに直接マークを付けます。

    message Foo {
      optional string secret = 1 [debug_redact = true];
    }
    
  • proto2.FieldOptions を拡張してEnum型のフィールドアノテーションをすでに定義しており、そのアノテーションの特定の値がリダクションしたいフィールドのマーク付けに使用されている場合、それらの値に debug_redact = true のアノテーションを付けることができます。そのような値でアノテーションが付けられたすべてのフィールドがリダクションされます。

    package my.package;
    
    extend proto2.FieldOptions {
      # The existing field annotation
      optional ContentType content_type = 1234567;
    };
    
    enum ContentType {
      PUBLIC = 0;
      SECRET = 1 [debug_redact = true];
    };
    
    message Foo {
      # will not be redacted
      optional string public_info = 1 [
        (my.package.content_type) = PUBLIC
      ];
      # will be redacted
      optional string secret = 1 [
        (my.package.content_type) = SECRET
      ];
    }
    

新しいデバッグ形式

既存のデバッグ形式と比較して、新しいデバッグ形式には2つの大きな違いがあります。

  • debug_redact でアノテーションが付けられた機密フィールドは、出力形式で自動的にリダクションされます。
  • 出力形式にはプロセスごとにランダム化されたプレフィックスが含まれるため、TextFormatパーサーでは解析できなくなります。

2つ目の変更は、protoに機密フィールドが含まれているかどうかに関わらず適用されることに注意してください。これにより、protoの内容に関係なく、いかなるデバッグ出力も常にデシリアライズできなくなります。