fix: verify caller_program_id in program output

This commit is contained in:
Moudy
2026-04-07 19:03:06 +02:00
parent 495680e2ea
commit 7d465dded7
17 changed files with 109 additions and 17 deletions
+2 -1
View File
@@ -15,7 +15,7 @@ fn main() {
let (
ProgramInput {
self_program_id,
caller_program_id: _,
caller_program_id,
pre_states,
instruction,
},
@@ -156,6 +156,7 @@ fn main() {
ProgramOutput::new(
self_program_id,
caller_program_id,
instruction_words,
pre_states_clone,
post_states,
@@ -5,7 +5,7 @@ fn main() {
let (
ProgramInput {
self_program_id,
caller_program_id: _,
caller_program_id,
pre_states,
instruction,
},
@@ -60,6 +60,7 @@ fn main() {
ProgramOutput::new(
self_program_id,
caller_program_id,
instruction_words,
pre_states_clone,
post_states,
@@ -68,7 +68,7 @@ fn main() {
let (
ProgramInput {
self_program_id,
caller_program_id: _,
caller_program_id,
pre_states,
instruction: balance_to_move,
},
@@ -86,5 +86,5 @@ fn main() {
_ => panic!("invalid params"),
};
ProgramOutput::new(self_program_id, instruction_words, pre_states, post_states).write();
ProgramOutput::new(self_program_id, caller_program_id, instruction_words, pre_states, post_states).write();
}
+2 -1
View File
@@ -47,7 +47,7 @@ fn main() {
let (
ProgramInput {
self_program_id,
caller_program_id: _,
caller_program_id,
pre_states,
instruction: solution,
},
@@ -82,6 +82,7 @@ fn main() {
ProgramOutput::new(
self_program_id,
caller_program_id,
instruction_words,
vec![pinata, winner],
vec![
@@ -53,7 +53,7 @@ fn main() {
let (
ProgramInput {
self_program_id,
caller_program_id: _,
caller_program_id,
pre_states,
instruction: solution,
},
@@ -100,6 +100,7 @@ fn main() {
ProgramOutput::new(
self_program_id,
caller_program_id,
instruction_words,
vec![
pinata_definition,
@@ -114,6 +114,15 @@ impl ExecutionState {
"Program output self_program_id does not match chained call program_id"
);
// Verify that the program output's caller_program_id matches the actual caller.
// This prevents a malicious user from privately executing an internal function
// by spoofing caller_program_id (e.g. passing caller_program_id = self_program_id
// to bypass access control checks).
assert_eq!(
program_output.caller_program_id, caller_program_id,
"Program output caller_program_id does not match actual caller"
);
// Check that the program is well behaved.
// See the # Programs section for the definition of the `validate_execution` method.
let execution_valid = validate_execution(
+2 -1
View File
@@ -13,7 +13,7 @@ fn main() {
let (
ProgramInput {
self_program_id,
caller_program_id: _,
caller_program_id,
pre_states,
instruction,
},
@@ -85,6 +85,7 @@ fn main() {
ProgramOutput::new(
self_program_id,
caller_program_id,
instruction_words,
pre_states_clone,
post_states,