Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport of prevent deleting MFA method through an invalid path into release/1.10.x #15705

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelog/15482.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
auth: Prevent deleting a valid MFA method ID using the endpoint for a different MFA method type
```
6 changes: 6 additions & 0 deletions vault/external_tests/mfa/login_mfa_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,12 @@ func TestLoginMFA_Method_CRUD(t *testing.T) {
t.Fatal("expected response id to match existing method id but it didn't")
}

// delete with invalid path should fail
_, err = client.Logical().Delete(invalidPath)
if err == nil {
t.Fatal("expected deleting an MFA method ID with invalid path to fail")
}

// delete it
_, err = client.Logical().Delete(myNewPath)
if err != nil {
Expand Down
8 changes: 4 additions & 4 deletions vault/identity_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ func mfaPaths(i *IdentityStore) []*framework.Path {
Summary: "Update or create a configuration for the given MFA method",
},
logical.DeleteOperation: &framework.PathOperation{
Callback: i.handleMFAMethodDelete,
Callback: i.handleMFAMethodTOTPDelete,
Summary: "Delete a configuration for the given MFA method",
},
},
Expand Down Expand Up @@ -335,7 +335,7 @@ func mfaPaths(i *IdentityStore) []*framework.Path {
Summary: "Update or create a configuration for the given MFA method",
},
logical.DeleteOperation: &framework.PathOperation{
Callback: i.handleMFAMethodDelete,
Callback: i.handleMFAMethodOKTADelete,
Summary: "Delete a configuration for the given MFA method",
},
},
Expand Down Expand Up @@ -391,7 +391,7 @@ func mfaPaths(i *IdentityStore) []*framework.Path {
Summary: "Update or create a configuration for the given MFA method",
},
logical.DeleteOperation: &framework.PathOperation{
Callback: i.handleMFAMethodDelete,
Callback: i.handleMFAMethodDUODelete,
Summary: "Delete a configuration for the given MFA method",
},
},
Expand Down Expand Up @@ -431,7 +431,7 @@ func mfaPaths(i *IdentityStore) []*framework.Path {
Summary: "Update or create a configuration for the given MFA method",
},
logical.DeleteOperation: &framework.PathOperation{
Callback: i.handleMFAMethodDelete,
Callback: i.handleMFAMethodPingIDDelete,
Summary: "Delete a configuration for the given MFA method",
},
},
Expand Down
26 changes: 23 additions & 3 deletions vault/login_mfa.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,12 +383,28 @@ func (i *IdentityStore) handleMFAMethodPingIDUpdate(ctx context.Context, req *lo
return i.handleMFAMethodUpdateCommon(ctx, req, d, mfaMethodTypePingID)
}

func (i *IdentityStore) handleMFAMethodDelete(ctx context.Context, req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
func (i *IdentityStore) handleMFAMethodTOTPDelete(ctx context.Context, req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
return i.handleMFAMethodDeleteCommon(ctx, req, d, mfaMethodTypeTOTP)
}

func (i *IdentityStore) handleMFAMethodOKTADelete(ctx context.Context, req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
return i.handleMFAMethodDeleteCommon(ctx, req, d, mfaMethodTypeOkta)
}

func (i *IdentityStore) handleMFAMethodDUODelete(ctx context.Context, req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
return i.handleMFAMethodDeleteCommon(ctx, req, d, mfaMethodTypeDuo)
}

func (i *IdentityStore) handleMFAMethodPingIDDelete(ctx context.Context, req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
return i.handleMFAMethodDeleteCommon(ctx, req, d, mfaMethodTypePingID)
}

func (i *IdentityStore) handleMFAMethodDeleteCommon(ctx context.Context, req *logical.Request, d *framework.FieldData, methodType string) (*logical.Response, error) {
methodID := d.Get("method_id").(string)
if methodID == "" {
return logical.ErrorResponse("missing method ID"), nil
}
return nil, i.mfaBackend.deleteMFAConfigByMethodID(ctx, methodID, memDBLoginMFAConfigsTable, loginMFAConfigPrefix)
return nil, i.mfaBackend.deleteMFAConfigByMethodID(ctx, methodID, methodType, memDBLoginMFAConfigsTable, loginMFAConfigPrefix)
}

func (i *IdentityStore) handleLoginMFAGenerateUpdate(ctx context.Context, req *logical.Request, d *framework.FieldData) (*logical.Response, error) {
Expand Down Expand Up @@ -2552,7 +2568,7 @@ func (b *LoginMFABackend) MemDBDeleteMFALoginEnforcementConfigByNameAndNamespace
return nil
}

func (b *LoginMFABackend) deleteMFAConfigByMethodID(ctx context.Context, configID, tableName, prefix string) error {
func (b *LoginMFABackend) deleteMFAConfigByMethodID(ctx context.Context, configID, methodType, tableName, prefix string) error {
var err error

if configID == "" {
Expand Down Expand Up @@ -2594,6 +2610,10 @@ func (b *LoginMFABackend) deleteMFAConfigByMethodID(ctx context.Context, configI
return nil
}

if mConfig.Type != methodType {
return fmt.Errorf("method type does not match the MFA config type")
}

mfaNs, err := b.Core.NamespaceByID(ctx, mConfig.NamespaceID)
if err != nil {
return err
Expand Down