Tuesday, November 10, 2026

What is MCP Rug Pull?

 An MCP (Model Context Protocol) rug pull is a security threat in AI agent ecosystems where a trusted Model Context Protocol server or tool silently changes its behavior, descriptions, code, or metadata after an organization or AI agent has already approved and integrated it. [1, 2]

How It Works

  • Initial Trust: An AI agent or engineering team reviews and approves an MCP server or tool (such as a utility or data fetcher) because it appears safe and benign. [1, 3]
  • The Silent Change: Later, the server operator updates the tool's backend implementation, parameter schemas, or hidden description fields (tool poisoning) without triggering a re-approval prompt in the client application. [3, 4]
  • Execution: Because the AI host caches the original trust decision rather than pinning the exact cryptographic hash of the tool's definition, the agent continues executing the hijacked tool blindly—often running unauthorized actions or leaking data. [4, 5, 6]

Why It Is Dangerous

  • No Re-Prompting: Most AI clients do not re-verify or warn the user when a tool's internal metadata or instructions shift post-approval. [2, 4]
  • Prompt Injection: Attackers can inject hidden prompts into tool descriptions that command the LLM to exfiltrate secrets, share chat histories, or execute destructive commands. [7, 8]
  • Supply Chain Risk: It exploits the assumption that a tool's behavior remains static once verified, mirroring traditional cryptocurrency exit scams ("rug pulls") on a software execution layer. [2, 9]

How to Prevent It

  • Hash-Pinning: Pin the exact cryptographic definition and version of tool schemas rather than trusting a floating server URL. [5]
  • Runtime Gateways: Implement a security gateway or middleware platform in front of MCP connections to inspect tools/list responses and block unapproved runtime changes. [4, 5, 6]
  • Re-Consent Policies: Force the AI client to re-prompt the user or engineering team whenever a tool definition, annotation (readOnlyHint, destructiveHint), or schema is altered. [6]
For deeper insights into runtime governance and threat mitigation, you can explore resources like NeuralTrust AI or MCP Manager. [4, 6]
If you are building or deploying AI agents, would you like to know how to set up runtime checks or which open-source tools can scan your MCP configurations for poisoned tools?

What is GraphGurard OS?

 GraphGuard refers to several distinct AI, security, and knowledge graph frameworks depending on the specific context:

1. GraphGuard OS (AI Agent Safety Infrastructure)

  • What it is: A safety operating system that sits between autonomous AI agent intent and tool execution.
  • How it works: Instead of relying on prompts or fine-tuning, it intercepts every proposed action from an LLM and validates it against executable rules stored in a Knowledge Graph (using Neo4j and SHACL) before any tool is called.
  • Learn more: Read the architectural breakdown on Medium. [1]

2. GraphGuard for Fraud Investigation & Financial Intelligence

  • What it is: A graph-powered AI agent and compliance platform used to investigate suspicious transactions, hidden ownership structures, and sanctions exposure. [2, 3]
  • How it works: It uses property graph databases like FalkorDB to map entities as nodes and relationships as connections, helping analysts trace money laundering paths or shared device footprints. You can explore the implementation on GitHub. [3, 4]

3. GraphGuard in Graph Neural Networks (GNNs)

  • What it is: A training-data-free security framework for Machine Learning as a Service (MLaaS) designed to detect and counteract unauthorized training data misuse or backdoor compromises in Graph Neural Networks. [5, 6]
  • How it works: It employs membership inference with radioactive data and synthetic graph-based unlearning to eliminate the impact of poisoned or stolen training graphs with minimal accuracy loss. [6, 7]

4. GraphGuard AI (Code Vulnerability Detection)

  • What it is: An automated forensic tool that uses Graph Attention Networks (GAT) and static analysis to detect buffer overflows, memory leaks, and logic flaws in C/C++ code. [8]
If you are looking for a specific use case, tell me:
  • Are you working with AI agents/LLMs, fraud detection, or cybersecurity/code analysis?
I can provide more targeted details or code examples.

What is Microsoft EchoLeak

 Microsoft EchoLeak (often misspelled as EhoLeak and tracked officially as CVE-2025-32711) is a critical zero-click AI vulnerability discovered in Microsoft 365 Copilot. Uncovered by security researchers at Aim Security in early 2025 and carrying a critical CVSS severity score of 9.3 out of 10, it was the first widely documented real-world exploit capable of silently stealing sensitive corporate data from a production AI assistant without requiring any user interaction. [1, 2, 3, 4, 5]

How the Exploit Worked

Researchers classified EchoLeak as an "LLM Scope Violation," meaning the attack tricked Copilot into treating untrusted external data with the same level of trust as privileged internal company data. The attack chain unfolded in three main stages: [3]
  • Hidden Payload Delivery. An attacker sent a specially crafted, seemingly normal email to a Microsoft 365 user. Inside the email, hidden instructions were embedded using plain text, HTML comments, or invisible formatting disguised as an internal organizational guide. [5, 6, 7, 8]
  • Zero-Click Retrieval. When the victim later asked Copilot a legitimate question related to the topic of the email, Copilot’s Retrieval-Augmented Generation (RAG) engine automatically pulled the malicious email into its context window alongside sensitive internal files from Outlook, OneDrive, SharePoint, and Teams. [2, 9, 10]
  • Silent Data Exfiltration. Following the hidden prompt injection, Copilot gathered confidential information from the user's session and embedded it into reference-style Markdown image links. By routing these auto-fetched image requests through an allowed Microsoft Teams proxy, the exploit bypassed Microsoft's Cross Prompt Injection Attempt (XPIA) classifiers, link redaction, and Content Security Policies (CSP) to send the stolen data directly to an attacker-controlled server. [1, 6, 7, 11]

Impact and Resolution

  • Potential Damage. Because the attack operated entirely through natural language processing and required zero clicks or phishing links, it bypassed traditional antivirus software and firewalls. Attackers could theoretically extract chat logs, API keys, proprietary documents, and emails without alerting the user. [4, 5, 12, 13]
  • Patch Status. Microsoft resolved the flaw with a server-side update rolled out between May and June 2025, meaning customers did not need to manually install a patch. According to SecurityWeek and BleepingComputer, there was no evidence that the vulnerability was exploited in the wild before Microsoft fixed it. [2, 10, 11]
If you'd like to explore this further, I can break down the technical bypass mechanisms (like XPIA evasion and Teams proxy abuse) or share security best practices for protecting enterprise AI tools against prompt injection. Which would be more helpful?

Sunday, November 8, 2026

Docker registry for Kubernetes applications. Multi Node and Single node Kubernetes applications

 Yes. In a multi-node Kubernetes cluster, every node that may run your application Pods must be able to reach the container registry URL.

The important detail is that container images are pulled by the container runtime on each Kubernetes node, not by the Pod itself.

For example, suppose you have three nodes:

  • node-1 runs AI Core.

  • node-2 runs API Server.

  • node-3 runs PostgreSQL.

If AI Core and API Server use images stored in registry.example.com:5000, both node-1 and node-2 must be able to resolve and connect to that address. node-3 also needs access if it pulls an image from the same registry.

1. Multi-node registry architecture

You normally need one shared registry, not one registry per Kubernetes node.

2. What must be configured on every node?

Requirement

Explanation

DNS resolution

Each node resolves the registry hostname to a reachable IP

Network connectivity

Each node can connect to the registry's port, normally HTTPS 443

TLS trust

Each node's container runtime trusts the registry certificate

Authentication

Kubernetes supplies image-pull credentials where required

Image reference

Deployments use the same registry hostname and image path

The registry can run on a dedicated VM, a separate Docker host, or inside Kubernetes. For production, an independently hosted registry is often simpler to bootstrap and recover.

3. Configure a shared registry for multiple nodes

Consider this example network:

Component

IP address

Registry server

192.168.1.100

Kubernetes Node 1

192.168.1.101

Kubernetes Node 2

192.168.1.102

Kubernetes Node 3

192.168.1.103

These are illustrative addresses.

Step A — Run the registry on a reachable server

On the registry server, a minimal development example is:

docker run -d \
  --name registry \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

Unlike binding to 127.0.0.1, this publishes the registry port on the host's network interfaces. Restrict access with firewall rules.

For production, configure HTTPS with a trusted certificate and registry authentication.

Step B — Verify connectivity from every node

On each Kubernetes node, test:

curl -v http://192.168.1.100:5000/v2/

For an unauthenticated HTTP registry, a successful response is typically {} with HTTP 200.

For an authenticated HTTPS registry, an HTTP 401 response can be expected before authentication.

This establishes network reachability, but doesn't yet guarantee that the container runtime trusts the registry.

Step C — Configure the container runtime

Your Kubernetes nodes use containerd, so it is containerd, not Docker Desktop on your MacBook, that needs to trust the registry.

For a production HTTPS registry using a certificate trusted by the node, normally no insecure-registry configuration is needed.

For an HTTP-only lab registry, containerd needs explicit configuration on each node. For example, with a containerd installation configured to use /etc/containerd/certs.d:

/etc/containerd/certs.d/
  192.168.1.100:5000/
    hosts.toml

Example hosts.toml:

server = "http://192.168.1.100:5000"

[host."http://192.168.1.100:5000"]
  capabilities = ["pull", "resolve"]

The containerd CRI registry configuration must point to that certificates directory, and containerd may need restarting. The exact procedure depends on your containerd version and Kubernetes distribution.

This HTTP configuration is for a trusted development network only.

Step D — Configure Kubernetes authentication

If the registry requires a username and password, create a Kubernetes image pull Secret:

kubectl create secret docker-registry registry-credentials \
  --docker-server=registry.example.com \
  --docker-username=myuser \
  --docker-password='YOUR_PASSWORD' \
  --namespace=myapp

Use the exact registry hostname and port, if applicable, that your image references use.

Then in your Deployment:

spec:
  template:
    spec:
      imagePullSecrets:
        - name: registry-credentials

      containers:
        - name: ai-core
          image: registry.example.com/myapp/ai-core:1.0.0
          imagePullPolicy: IfNotPresent

The Secret is stored in the Kubernetes namespace and is available to the kubelet on whichever node schedules the Pod. You do not need to create a separate Secret on each node.

GitHub+1

4. Configure the registry in Helm

For your application, centralize the registry settings in values.yaml:

global:
  imageRegistry: "registry.example.com"
  imagePullSecrets:
    - name: registry-credentials

aiCore:
  image:
    repository: "myapp/ai-core"
    tag: "1.0.0"
    pullPolicy: IfNotPresent

apiServer:
  image:
    repository: "myapp/api-server"
    tag: "1.0.0"
    pullPolicy: IfNotPresent

Your Helm Deployment template can construct the full image name:

spec:
  template:
    spec:
      imagePullSecrets:
        {{- toYaml .Values.global.imagePullSecrets | nindent 8 }}

      containers:
        - name: ai-core
          image: "{{ .Values.global.imageRegistry }}/{{ .Values.aiCore.image.repository }}:{{ .Values.aiCore.image.tag }}"
          imagePullPolicy: {{ .Values.aiCore.image.pullPolicy }}

Every node uses the same image reference. Kubernetes automatically attempts the pull on the node where the Pod is scheduled.

5. Special consideration for your MacBook and Minikube

Because you're running Minikube with Docker Desktop on macOS, Minikube nodes are containers inside Docker Desktop's Linux environment.

This creates an important networking distinction:

  • localhost:5000 on your MacBook means your MacBook.

  • localhost:5000 inside a Minikube node means that Minikube node.

  • host.docker.internal may provide access to the Docker Desktop host from containers, but its availability and resolution must be verified inside each Minikube node.

For a local experiment, you can use a registry hosted on your MacBook and configure Minikube nodes to reach it through an address available inside Docker Desktop's network. Minikube also documents registry-specific configurations for macOS.

minikube

To test each Minikube node:

minikube node list -p myapp

Then:

minikube ssh -p myapp -n myapp -- \
  curl -v http://host.docker.internal:5000/v2/

Repeat with the other node names reported by minikube node list.

If the hostname doesn't resolve or the connection fails, the registry network must be configured before using it for image pulls.

6. What happens if one node cannot access the registry?

Suppose the registry is reachable from Node 1 and Node 2, but not Node 3.

If Kubernetes schedules AI Core on Node 3:

  1. Kubelet requests the image from containerd.

  2. Containerd attempts to contact the registry.

  3. The connection fails.

  4. The Pod may enter ErrImagePull and subsequently ImagePullBackOff.

Diagnose with:

kubectl describe pod <pod-name> -n myapp

If the required image is already cached on Node 3 and the pull policy is IfNotPresent, Kubernetes may start the Pod without contacting the registry. This is not a reliable substitute for registry connectivity across nodes.

Kubernetes

Recommendation for your environments

For your MacBook multi-node Minikube experiment, use one registry reachable from all Minikube nodes, with the same registry hostname in your Helm values.

For your customer's future multi-node Kubernetes deployment, use a centrally accessible private registry with HTTPS, authentication, and persistent storage. Avoid registry URLs that refer to an individual node's localhost.

The key principle is:

One shared registry → multiple Kubernetes nodes → each node independently pulls the images it needs.

You configure connectivity and TLS trust at the node/container-runtime level, authentication through Kubernetes image pull Secrets, and image names through Helm.

Helm tool vs Kubectl w.r.to creating clusters and application

 Yes. Before running helm install, a Kubernetes cluster must already exist and be running.

Helm does not create a Kubernetes cluster. It installs applications into an existing cluster.

In your case, Minikube creates the Kubernetes cluster, and Helm deploys your application into it.

1. Correct sequence for your application

  1. Start the Kubernetes cluster

    minikube start -p myapp \
      --driver=docker \
      --container-runtime=containerd

    If the myapp profile already exists but is stopped, Minikube starts the existing cluster. Otherwise, it creates a new cluster.

  2. Select the Kubernetes context

    kubectl config use-context myapp

    Verify that the cluster is ready:

    kubectl get nodes
  3. Install the Helm application

    helm upgrade --install myapp ./helm/myapp \
      --kube-context myapp \
      --namespace myapp \
      --create-namespace \
      -f ./helm/myapp/values-minikube.yaml

    This installs your application into the existing Minikube cluster.

  4. Verify the application

    kubectl get pods -n myapp
    kubectl get svc -n myapp
    kubectl get pvc -n myapp

2. What each tool creates

Tool

Responsibility

minikube start -p myapp

Creates or starts the Kubernetes cluster and its nodes

kubectl

Inspects and manages Kubernetes resources

helm install

Installs your application resources into the cluster

helm uninstall

Removes Helm-managed application resources

minikube stop

Stops the cluster without deleting it

minikube delete

Deletes the entire Minikube cluster

3. What if the cluster already exists?

You do not need to recreate it before every Helm installation.

Check:

minikube status -p myapp

If the cluster is already running, directly execute your Helm installation command.

If the cluster is stopped, run:

minikube start -p myapp

If you previously ran helm uninstall, but the Minikube cluster is still running, you can directly reinstall using helm install or helm upgrade --install.

One additional point for your setup: Because your Helm charts use local PVs and PVCs, ensure that the required storage directories and PV definitions are available before installing workloads that depend on them. If your PVs are defined separately from the Helm chart, apply those manifests first.

In summary:

Minikube start → Kubernetes cluster ready → Helm install → Application Pods running

Helm manages applications, not the underlying Kubernetes cluster.

PersistentVolumeClaim RWO

 ReadWriteOnce (RWO) is sufficient for your PostgreSQL volume if the PostgreSQL Pod runs on a single node. It is also sufficient for multiple Pods sharing a filesystem, provided all those Pods are scheduled on the same node.

However, there is an important distinction: multiple Pods accessing the same volume is not the same as multiple PostgreSQL instances accessing the same database directory.

You should not allow multiple independent PostgreSQL server instances to write to the same PostgreSQL data directory.

1. What does accessModes: ReadWriteOnce mean?

Kubernetes supports these access modes:

Access mode

Meaning

Multiple Pods, same node

Multiple nodes

ReadWriteOnce (RWO)

Read/write access from one node

Yes

No, not concurrently

ReadOnlyMany (ROX)

Read-only access from multiple nodes

Yes

Yes, if backend supports it

ReadWriteMany (RWX)

Read/write access from multiple nodes

Yes

Yes, if backend supports it

ReadWriteOncePod (RWOP)

Read/write access restricted to one Pod

No

No

RWO is a node-level access mode, not a Pod-level access mode.

For example:

Both Pods can mount the same RWO PVC because they are on the same node and the underlying volume supports it.

2. What happens with multiple Minikube nodes?

Suppose your Minikube profile contains three nodes:

Minikube cluster: myapp-dev
│
├── Node 1: minikube
│   ├── PostgreSQL Pod
│   └── Local PV: /data/myapp/postgres
│
├── Node 2: minikube-m02
│   └── API Server Pod
│
└── Node 3: minikube-m03
    └── AI Core Pod

Your local PostgreSQL PV is tied to Node 1.

The PostgreSQL volume cannot be mounted on Node 2 or Node 3 because it is local to Node 1.

But this does not prevent your API Server and AI Core from accessing PostgreSQL.

They should access PostgreSQL over the Kubernetes network using a Service:

API Server Pod (Node 2)
       |
       | TCP 5432
       v
postgres-service
       |
       v
PostgreSQL Pod (Node 1)

Your API Server and AI Core should not mount the PostgreSQL data PVC. They only need the PostgreSQL connection string.

For example:

postgresql://user:password@postgres-service:5432/myapp

3. PostgreSQL PVC vs shared-files PVC

Your generator has created two volumes:

Volume

Host path

Intended use

Recommended access

PostgreSQL PV

/data/myapp/postgress

Database files

RWO

Shared-files PV

/data/myapp/shared

Files shared between AI Core and API

RWO for single-node; RWX-capable backend for cross-node

These volumes have different requirements.

PostgreSQL: Only the PostgreSQL server Pod should mount the data PVC. Other application Pods communicate through the PostgreSQL Service.

Shared files: Both AI Core and API Server may need to mount the same PVC. With a local RWO volume, they must run on the node hosting that storage.

If the application scales across multiple nodes, you should consider NFS, a CSI driver backed by shared storage, or object storage for application-generated files.

4. Problems in your generated YAML

There are several issues worth correcting.

First, the YAML has capitalization and spelling errors. Kubernetes fields and access mode values are case-sensitive.

For example:

Your YAML

Correct

REadWriteOnce

ReadWriteOnce

Capacity

capacity

Required

required

matchExperssions

matchExpressions

noteSelectorTErms

nodeSelectorTerms

Kubernetes.io/hostnames

kubernetes.io/hostname

Type

type

Second, your PV uses hostPath together with nodeAffinity.

For production-style node-local persistent storage, I recommend using the local PV source instead of hostPath.

hostPath is primarily suitable for single-node development and testing. It can also create security and scheduling risks if used without careful controls.

Third, your host paths are under /data, whereas your previously defined customer storage allocation places application and PostgreSQL data under /apps. The production values should preserve that allocation.

5. Recommended corrected PostgreSQL PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: myapp-postgres-pv
spec:
  capacity:
    storage: 20Gi

  volumeMode: Filesystem

  accessModes:
    - ReadWriteOnce

  persistentVolumeReclaimPolicy: Retain

  storageClassName: myapp-local

  local:
    path: /apps/postgres_data1

  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - customer-node-1

The directory must already exist on the specified node, with correct filesystem permissions. Replace customer-node-1 with the actual Kubernetes node hostname.

For Minikube, you can use a different PV definition with the appropriate node hostname and development storage path.

6. How to check where your Pods are running

kubectl get nodes
kubectl get pods -n ai-lab -o wide

The second command displays the node hosting each Pod.

To inspect your PV:

kubectl get pv
kubectl describe pv myapp-postgres-pv

To inspect your PVC:

kubectl get pvc -n ai-lab

To validate the generated YAML:

kubectl apply --dry-run=server -f your-pv.yaml

For a Helm-generated PV, render the template first and validate the rendered manifest.

7. Final recommendation for your application

Scenario

PostgreSQL storage

Shared application files

Single-node Minikube

RWO local PV/PVC

RWO local PV/PVC

Multi-node Minikube

RWO local PV, pinned to one node

RWX shared storage, or pin both application Pods to the storage node

Single-node customer Kubernetes

RWO local PV under /apps

RWO local PV under /apps

Future multi-node production

RWO storage with suitable node placement and recovery strategy

RWX-capable storage or object storage

For your current single-node customer deployment, RWO is sufficient for both PostgreSQL and shared files.

For multi-node Minikube, PostgreSQL can remain on one node while AI Core and API Server communicate with it over the network. However, the shared-files PVC requires special consideration because both application Pods must access the same files.

One final point: Kubernetes access modes are not a database concurrency-control mechanism or a security boundary. RWO does not prevent two PostgreSQL processes on the same node from attempting to use the same data directory. Ensure your PostgreSQL deployment has only one active database instance using that directory.

Saturday, November 7, 2026

What are few Main Helm commands

These are the commands you will use most frequently.

Command

Purpose

helm create myapp

Generate a starter Helm chart

helm lint ./helm/myapp

Check a chart for common problems

helm template

Render templates into Kubernetes YAML without installing

helm install

Install a new release

helm upgrade

Upgrade an existing release

helm upgrade --install

Install if absent, otherwise upgrade

helm list

List installed releases

helm status

Inspect release status

helm get values

Show values used by a release

helm get manifest

Show the rendered Kubernetes resources

helm history

Show release revision history

helm rollback

Roll back to an earlier release revision

helm uninstall

Remove a release

helm package

Package a chart as a .tgz archive

helm repo add / helm repo update

Manage remote chart repositories


the most useful command that i could find is preview . This helps to preview the kubernetes files that it creates 

helm template myapp ./helm/myapp -f ./helm/myapp/Chart.yaml 

this describes the kubernetes native files that are going to get generated.